87class SCOPED_CAPABILITY MutexLock {
88 typedef std::unique_lock<std::mutex> MutexLockImp;
91 MutexLock(Mutex& m) ACQUIRE(m) : ml_(m.native_handle()) {}
92 ~MutexLock() RELEASE() {}
93 MutexLockImp& native_handle() {
return ml_; }
101 Barrier(
int num_threads) : running_threads_(num_threads) {}
104 bool wait() EXCLUDES(lock_) {
105 bool last_thread =
false;
108 last_thread = createBarrier(ml);
110 if (last_thread) phase_condition_.notify_all();
114 void removeThread() EXCLUDES(lock_) {
117 if (entered_ != 0) phase_condition_.notify_all();
122 Condition phase_condition_;
123 int running_threads_;
126 int phase_number_ = 0;
132 bool createBarrier(
MutexLock& ml) REQUIRES(lock_) {
133 BM_CHECK_LT(entered_, running_threads_);
135 if (entered_ < running_threads_) {
137 int phase_number_cp = phase_number_;
138 auto cb = [
this, phase_number_cp]() {
139 return this->phase_number_ > phase_number_cp ||
140 entered_ == running_threads_;
142 phase_condition_.wait(ml.native_handle(), cb);
143 if (phase_number_ > phase_number_cp)
return false;