[RISCV][GISel] Remove unnecessary Observer notifications from legalizeVAStart.
[llvm-project.git] / third-party / benchmark / src / thread_manager.h
blob4680285089401c8ce41f61b0e3e9088c8b7d1737
1 #ifndef BENCHMARK_THREAD_MANAGER_H
2 #define BENCHMARK_THREAD_MANAGER_H
4 #include <atomic>
6 #include "benchmark/benchmark.h"
7 #include "mutex.h"
9 namespace benchmark {
10 namespace internal {
12 class ThreadManager {
13 public:
14 explicit ThreadManager(int num_threads)
15 : alive_threads_(num_threads), start_stop_barrier_(num_threads) {}
17 Mutex& GetBenchmarkMutex() const RETURN_CAPABILITY(benchmark_mutex_) {
18 return benchmark_mutex_;
21 bool StartStopBarrier() EXCLUDES(end_cond_mutex_) {
22 return start_stop_barrier_.wait();
25 void NotifyThreadComplete() EXCLUDES(end_cond_mutex_) {
26 start_stop_barrier_.removeThread();
27 if (--alive_threads_ == 0) {
28 MutexLock lock(end_cond_mutex_);
29 end_condition_.notify_all();
33 void WaitForAllThreads() EXCLUDES(end_cond_mutex_) {
34 MutexLock lock(end_cond_mutex_);
35 end_condition_.wait(lock.native_handle(),
36 [this]() { return alive_threads_ == 0; });
39 struct Result {
40 IterationCount iterations = 0;
41 double real_time_used = 0;
42 double cpu_time_used = 0;
43 double manual_time_used = 0;
44 int64_t complexity_n = 0;
45 std::string report_label_;
46 std::string error_message_;
47 bool has_error_ = false;
48 UserCounters counters;
50 GUARDED_BY(GetBenchmarkMutex()) Result results;
52 private:
53 mutable Mutex benchmark_mutex_;
54 std::atomic<int> alive_threads_;
55 Barrier start_stop_barrier_;
56 Mutex end_cond_mutex_;
57 Condition end_condition_;
60 } // namespace internal
61 } // namespace benchmark
63 #endif // BENCHMARK_THREAD_MANAGER_H