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