// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JFJOCH_INDEXERTHREADPOOL_H #define JFJOCH_INDEXERTHREADPOOL_H #include #include #include #include #include #include #include #include #include #include #include "../common/JFJochMessages.h" #include "../common/DiffractionSpot.h" #include "../common/DiffractionExperiment.h" #include "../common/NUMAHWPolicy.h" #include "Indexer.h" class IndexerThread { struct TaskInput { const DiffractionExperiment &experiment; const std::vector &recip; }; bool stop = false; enum class TaskState {STARTING, IDLE, READY, RUNNING, COMPLETED, ERROR} state = TaskState::STARTING; std::mutex m; std::condition_variable c_running; std::condition_variable c_start; std::condition_variable c_done; std::unique_ptr result = nullptr; std::unique_ptr task_input = nullptr; std::thread worker_thread; void Worker(const IndexingSettings& settings, int threadid); public: IndexerThread(const IndexingSettings& settings, int threadid); ~IndexerThread(); std::unique_ptr Run(const DiffractionExperiment &experiment, const std::vector &recip); void Finalize(); }; class IndexerThreadPool { std::mutex m; std::condition_variable c; std::vector worker_busy; size_t worker_free_count; std::vector> tasks; const int64_t viable_cell_min_spots; const bool blocking; int GetFreeWorker(); public: IndexerThreadPool(const IndexingSettings& settings); IndexerResult Run(const DiffractionExperiment& experiment, const std::vector& recip); }; #endif //JFJOCH_INDEXERTHREADPOOL_H