xref: /aosp_15_r20/external/google-benchmark/src/thread_manager.h (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
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