From 6c65f26591800fb20e37ba2a82fb659be07c7d22 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Wed, 10 Oct 2012 18:03:37 -0700 Subject: [PATCH] spsc-queue: fixup atomics, mutexes, threads --- spsc-queue/eventcount.h | 14 ++++++++------ spsc-queue/queue.h | 8 +++++--- spsc-queue/spsc-queue.cc | 14 +++++++++----- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/spsc-queue/eventcount.h b/spsc-queue/eventcount.h index f64946a..bf1f511 100644 --- a/spsc-queue/eventcount.h +++ b/spsc-queue/eventcount.h @@ -1,12 +1,14 @@ #include +#include +#include class eventcount { public: - eventcount() - : count(0) - , waiters(0) - {} + eventcount() : waiters(0) + { + count = 0; + } void signal_relaxed() { @@ -46,7 +48,7 @@ std::memory_order_seq_cst); private: std::atomic count; rl::var waiters; - mutex guard; + std::mutex guard; condition_variable_any cv; void signal_impl(unsigned cmp) @@ -54,7 +56,7 @@ private: 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; diff --git a/spsc-queue/queue.h b/spsc-queue/queue.h index 7a6f29e..3167e22 100644 --- a/spsc-queue/queue.h +++ b/spsc-queue/queue.h @@ -1,4 +1,5 @@ #include +#include #include "eventcount.h" @@ -51,9 +52,10 @@ private: rl::var data; node(T data = T()) - : next(0) - , data(data) - {} + : data(data) + { + next = 0; + } }; rl::var head; diff --git a/spsc-queue/spsc-queue.cc b/spsc-queue/spsc-queue.cc index a81a1d0..ef7b026 100644 --- a/spsc-queue/spsc-queue.cc +++ b/spsc-queue/spsc-queue.cc @@ -1,8 +1,8 @@ +#include + #include "queue.h" -struct spsc_queue_test : rl::test_suite -{ - spsc_queue q; +spsc_queue q; void thread(unsigned thread_index) { @@ -16,9 +16,13 @@ struct spsc_queue_test : rl::test_suite RL_ASSERT(11 == d); } } -}; int main() { - rl::simulate(); + thrd_t A, B; + thrd_create(&A, (thrd_start_t)&thread, (void *)0); + thrd_create(&B, (thrd_start_t)&thread, (void *)1); + thrd_join(A); + thrd_join(B); + return 0; } -- 2.34.1