spsc-queue: don't statically construct the queue
[model-checker-benchmarks.git] / spsc-queue / queue.h
index d65477bf71d99f62edb54220cd2447b5611fcc52..3167e22bf8e4f98d1d29129ea91dbbf933ef635a 100644 (file)
@@ -1,3 +1,6 @@
+#include <unrelacy.h>
+#include <atomic>
+
 #include "eventcount.h"
 
 template<typename T>
@@ -7,21 +10,21 @@ public:
        spsc_queue()
        {
                node* n = RL_NEW node ();
-               head($) = n;
-               tail($) = n;
+               head = n;
+               tail = n;
        }
 
        ~spsc_queue()
        {
-               RL_ASSERT(head($) == tail($));
+               RL_ASSERT(head == tail);
                RL_DELETE((node*)head($));
        }
 
        void enqueue(T data)
        {
                node* n = RL_NEW node (data);
-               head($)->next($).store(n, std::memory_order_release);
-               head($) = n;
+               head($)->next.store(n, std::memory_order_release);
+               head = n;
                ec.signal_relaxed();
        }
 
@@ -49,9 +52,10 @@ private:
                rl::var<T> data;
 
                node(T data = T())
-                       : next(0)
-                       , data(data)
-               {}
+                       : data(data)
+               {
+                       next = 0;
+               }
        };
 
        rl::var<node*> head;
@@ -62,12 +66,12 @@ private:
        T try_dequeue()
        {
                node* t = tail($);
-               node* n = t->next($).load(std::memory_order_acquire);
+               node* n = t->next.load(std::memory_order_acquire);
                if (0 == n)
                        return 0;
                T data = n->data($);
                RL_DELETE(t);
-               tail($) = n;
+               tail = n;
                return data;
        }
 };