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