4 #include <condition_variable>
9 eventcount() : waiters(0)
16 unsigned cmp = count.load(std::memory_order_relaxed);
22 unsigned cmp = count.fetch_add(0, std::memory_order_seq_cst);
28 unsigned cmp = count.fetch_or(0x80000000,
29 std::memory_order_seq_cst);
30 return cmp & 0x7FFFFFFF;
33 void wait(unsigned cmp)
35 unsigned ec = count.load(std::memory_order_seq_cst);
36 if (cmp == (ec & 0x7FFFFFFF))
39 ec = count.load(std::memory_order_seq_cst);
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, std::memory_order_relaxed));
62 unsigned w = waiters($);