1*58b9f456SAndroid Build Coastguard Worker #ifndef BENCHMARK_THREAD_MANAGER_H 2*58b9f456SAndroid Build Coastguard Worker #define BENCHMARK_THREAD_MANAGER_H 3*58b9f456SAndroid Build Coastguard Worker 4*58b9f456SAndroid Build Coastguard Worker #include <atomic> 5*58b9f456SAndroid Build Coastguard Worker 6*58b9f456SAndroid Build Coastguard Worker #include "benchmark/benchmark.h" 7*58b9f456SAndroid Build Coastguard Worker #include "mutex.h" 8*58b9f456SAndroid Build Coastguard Worker 9*58b9f456SAndroid Build Coastguard Worker namespace benchmark { 10*58b9f456SAndroid Build Coastguard Worker namespace internal { 11*58b9f456SAndroid Build Coastguard Worker 12*58b9f456SAndroid Build Coastguard Worker class ThreadManager { 13*58b9f456SAndroid Build Coastguard Worker public: ThreadManager(int num_threads)14*58b9f456SAndroid Build Coastguard Worker ThreadManager(int num_threads) 15*58b9f456SAndroid Build Coastguard Worker : alive_threads_(num_threads), start_stop_barrier_(num_threads) {} 16*58b9f456SAndroid Build Coastguard Worker GetBenchmarkMutex()17*58b9f456SAndroid Build Coastguard Worker Mutex& GetBenchmarkMutex() const RETURN_CAPABILITY(benchmark_mutex_) { 18*58b9f456SAndroid Build Coastguard Worker return benchmark_mutex_; 19*58b9f456SAndroid Build Coastguard Worker } 20*58b9f456SAndroid Build Coastguard Worker StartStopBarrier()21*58b9f456SAndroid Build Coastguard Worker bool StartStopBarrier() EXCLUDES(end_cond_mutex_) { 22*58b9f456SAndroid Build Coastguard Worker return start_stop_barrier_.wait(); 23*58b9f456SAndroid Build Coastguard Worker } 24*58b9f456SAndroid Build Coastguard Worker NotifyThreadComplete()25*58b9f456SAndroid Build Coastguard Worker void NotifyThreadComplete() EXCLUDES(end_cond_mutex_) { 26*58b9f456SAndroid Build Coastguard Worker start_stop_barrier_.removeThread(); 27*58b9f456SAndroid Build Coastguard Worker if (--alive_threads_ == 0) { 28*58b9f456SAndroid Build Coastguard Worker MutexLock lock(end_cond_mutex_); 29*58b9f456SAndroid Build Coastguard Worker end_condition_.notify_all(); 30*58b9f456SAndroid Build Coastguard Worker } 31*58b9f456SAndroid Build Coastguard Worker } 32*58b9f456SAndroid Build Coastguard Worker WaitForAllThreads()33*58b9f456SAndroid Build Coastguard Worker void WaitForAllThreads() EXCLUDES(end_cond_mutex_) { 34*58b9f456SAndroid Build Coastguard Worker MutexLock lock(end_cond_mutex_); 35*58b9f456SAndroid Build Coastguard Worker end_condition_.wait(lock.native_handle(), 36*58b9f456SAndroid Build Coastguard Worker [this]() { return alive_threads_ == 0; }); 37*58b9f456SAndroid Build Coastguard Worker } 38*58b9f456SAndroid Build Coastguard Worker 39*58b9f456SAndroid Build Coastguard Worker public: 40*58b9f456SAndroid Build Coastguard Worker struct Result { 41*58b9f456SAndroid Build Coastguard Worker int64_t iterations = 0; 42*58b9f456SAndroid Build Coastguard Worker double real_time_used = 0; 43*58b9f456SAndroid Build Coastguard Worker double cpu_time_used = 0; 44*58b9f456SAndroid Build Coastguard Worker double manual_time_used = 0; 45*58b9f456SAndroid Build Coastguard Worker int64_t complexity_n = 0; 46*58b9f456SAndroid Build Coastguard Worker std::string report_label_; 47*58b9f456SAndroid Build Coastguard Worker std::string error_message_; 48*58b9f456SAndroid Build Coastguard Worker bool has_error_ = false; 49*58b9f456SAndroid Build Coastguard Worker UserCounters counters; 50*58b9f456SAndroid Build Coastguard Worker }; 51*58b9f456SAndroid Build Coastguard Worker GUARDED_BY(GetBenchmarkMutex()) Result results; 52*58b9f456SAndroid Build Coastguard Worker 53*58b9f456SAndroid Build Coastguard Worker private: 54*58b9f456SAndroid Build Coastguard Worker mutable Mutex benchmark_mutex_; 55*58b9f456SAndroid Build Coastguard Worker std::atomic<int> alive_threads_; 56*58b9f456SAndroid Build Coastguard Worker Barrier start_stop_barrier_; 57*58b9f456SAndroid Build Coastguard Worker Mutex end_cond_mutex_; 58*58b9f456SAndroid Build Coastguard Worker Condition end_condition_; 59*58b9f456SAndroid Build Coastguard Worker }; 60*58b9f456SAndroid Build Coastguard Worker 61*58b9f456SAndroid Build Coastguard Worker } // namespace internal 62*58b9f456SAndroid Build Coastguard Worker } // namespace benchmark 63*58b9f456SAndroid Build Coastguard Worker 64*58b9f456SAndroid Build Coastguard Worker #endif // BENCHMARK_THREAD_MANAGER_H 65