14#ifndef EIGEN_THREADPOOL_BARRIER_H
15#define EIGEN_THREADPOOL_BARRIER_H
18#include "./InternalHeaderCheck.h"
24 Barrier(
unsigned int count) : state_(count << 1), notified_(false) {
25 eigen_plain_assert(((count << 1) >> 1) == count);
27 ~Barrier() { eigen_plain_assert((state_ >> 1) == 0); }
30 unsigned int v = state_.fetch_sub(2, std::memory_order_acq_rel) - 2;
35 eigen_plain_assert(((v + 2) & ~1) != 0);
38 EIGEN_MUTEX_LOCK l(mu_);
39 eigen_plain_assert(!notified_);
45 unsigned int v = state_.fetch_or(1, std::memory_order_acq_rel);
46 if ((v >> 1) == 0)
return;
47 EIGEN_MUTEX_LOCK l(mu_);
56 std::atomic<unsigned int> state_;
65struct Notification : Barrier {
66 Notification() : Barrier(1) {}