brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 819b3c4 Raw
64 lines · c
1#ifndef BENCHMARK_THREAD_MANAGER_H2#define BENCHMARK_THREAD_MANAGER_H3 4#include <atomic>5 6#include "benchmark/benchmark.h"7#include "mutex.h"8 9namespace benchmark {10namespace internal {11 12class ThreadManager {13 public:14  explicit ThreadManager(int num_threads)15      : alive_threads_(num_threads), start_stop_barrier_(num_threads) {}16 17  Mutex& GetBenchmarkMutex() const RETURN_CAPABILITY(benchmark_mutex_) {18    return benchmark_mutex_;19  }20 21  bool StartStopBarrier() EXCLUDES(end_cond_mutex_) {22    return start_stop_barrier_.wait();23  }24 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();30    }31  }32 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; });37  }38 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 skip_message_;47    internal::Skipped skipped_ = internal::NotSkipped;48    UserCounters counters;49  };50  GUARDED_BY(GetBenchmarkMutex()) Result results;51 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_;58};59 60}  // namespace internal61}  // namespace benchmark62 63#endif  // BENCHMARK_THREAD_MANAGER_H64