X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker-benchmarks.git;a=blobdiff_plain;f=spsc-queue%2Feventcount.h;h=aec3e8c9b216b9d71c9b561287d7d95828386f1a;hp=226603e7b9b3555ddbd7e436fdb7611d555736b6;hb=993e7e5146f39ff0ed459ac0a8bc30e7a0253156;hpb=ced31653a84f29c3f236fb5976f1241262953914 diff --git a/spsc-queue/eventcount.h b/spsc-queue/eventcount.h index 226603e..aec3e8c 100644 --- a/spsc-queue/eventcount.h +++ b/spsc-queue/eventcount.h @@ -1,41 +1,46 @@ +#include +#include +#include +#include + class eventcount { public: - eventcount() - : count(0) - , waiters(0) - {} + eventcount() : waiters(0) + { + count = 0; + } void signal_relaxed() { - unsigned cmp = count($).load(std::memory_order_relaxed); + unsigned cmp = count.load(std::memory_order_relaxed); signal_impl(cmp); } void signal() { - unsigned cmp = count($).fetch_add(0, std::memory_order_seq_cst); + unsigned cmp = count.fetch_add(0, std::memory_order_seq_cst); signal_impl(cmp); } unsigned get() { - unsigned cmp = count($).fetch_or(0x80000000, + unsigned cmp = count.fetch_or(0x80000000, std::memory_order_seq_cst); return cmp & 0x7FFFFFFF; } void wait(unsigned cmp) { - unsigned ec = count($).load(std::memory_order_seq_cst); + unsigned ec = count.load(std::memory_order_seq_cst); if (cmp == (ec & 0x7FFFFFFF)) { guard.lock($); - ec = count($).load(std::memory_order_seq_cst); + ec = count.load(std::memory_order_seq_cst); if (cmp == (ec & 0x7FFFFFFF)) { - waiters($) += 1; - cv.wait(guard, $); + waiters += 1; + cv.wait(guard); } guard.unlock($); } @@ -44,18 +49,18 @@ std::memory_order_seq_cst); private: std::atomic count; rl::var waiters; - mutex guard; - condition_variable_any cv; + std::mutex guard; + std::condition_variable cv; void signal_impl(unsigned cmp) { if (cmp & 0x80000000) { guard.lock($); - while (false == count($).compare_swap(cmp, + while (false == count.compare_exchange_weak(cmp, (cmp + 1) & 0x7FFFFFFF, std::memory_order_relaxed)); unsigned w = waiters($); - waiters($) = 0; + waiters = 0; guard.unlock($); if (w) cv.notify_all($);