4 #include <condition_variable>
10 eventcount() : waiters(0)
17 unsigned cmp = count.load(wildcard(1)); // relaxed
23 unsigned cmp = count.fetch_add(0, std::memory_order_seq_cst); // the fix
29 unsigned cmp = count.fetch_or(0x80000000, wildcard(2)); // sc
30 return cmp & 0x7FFFFFFF;
33 void wait(unsigned cmp)
35 unsigned ec = count.load(wildcard(3)); // sc
36 if (cmp == (ec & 0x7FFFFFFF))
39 ec = count.load(wildcard(4)); // sc
40 if (cmp == (ec & 0x7FFFFFFF))
50 std::atomic<unsigned> count;
51 rl::var<unsigned> waiters;
53 std::condition_variable cv;
55 void signal_impl(unsigned cmp)
60 while (false == count.compare_exchange_weak(cmp,
61 (cmp + 1) & 0x7FFFFFFF, wildcard(5))); // relaxed
62 unsigned w = waiters($);