871e10fd5feb595826f181d60bc5e31c0be34a29
[model-checker-benchmarks.git] / barrier / barrier.h
1 #include <atomic>
2
3 class spinning_barrier {
4  public:
5         spinning_barrier (unsigned int n) : n_ (n), nwait_ (0), step_(0) {}
6
7         bool wait() {
8                 unsigned int step = step_.load ();
9
10                 if (nwait_.fetch_add (1) == n_ - 1) {
11                         /* OK, last thread to come.  */
12                         nwait_.store (0); // XXX: maybe can use relaxed ordering here ??
13                         step_.fetch_add (1);
14                         return true;
15                 } else {
16                         /* Run in circles and scream like a little girl.  */
17                         while (step_.load () == step)
18                                 ;
19                         return false;
20                 }
21         }
22
23  protected:
24         /* Number of synchronized threads. */
25         const unsigned int n_;
26
27         /* Number of threads currently spinning.  */
28         std::atomic<unsigned int> nwait_;
29
30         /* Number of barrier syncronizations completed so far, 
31          *      * it's OK to wrap.  */
32         std::atomic<unsigned int> step_;
33 };