changes to spsc example
[model-checker-benchmarks.git] / spsc-example / queue.h
index 76430e73d01fec8fa4c31248b5eda3a88275bac7..f96f9f09359860530cb3264125787b1c7071dd89 100644 (file)
@@ -1,39 +1,41 @@
 #include <unrelacy.h>
 #include <atomic>
+#include "wildcard.h"
 
 using namespace std;
 
+#define acquire memory_order_acquire
+#define release memory_order_release
+#define relaxed memory_order_relaxed
+
 struct node {
-       node(int d): data(d) {
-               next.store(0, memory_order_relaxed);
+       node(int idx) {
+               index.store(idx, relaxed);
+               next.store(0, relaxed);
        }
        atomic<node*> next;
-       int data;
+       atomic<int> index;
 };
 
 class spsc_queue
 {
-       atomic<node*> head, tail;
+       node *head, *tail;
        public:
        spsc_queue() {
-               head = tail = new node(0);
+               head = tail = new node(-1);
        }
-
-       void enqueue(int val) {
-               node* n = new node(val);
-               node *h = head.load(memory_order_relaxed); 
-               h->next.store(n, memory_order_release);
-               head.store(n, memory_order_relaxed);
+       void enqueue(int idx) {
+               node* n = new node(idx);
+               tail->next.store(n, release);
+               tail = n;
        }
-
-       bool dequeue(int *v) {
-               node* t = tail.load(memory_order_relaxed);
-               node* n = t->next.load(memory_order_acquire);
-               if (0 == n)
-                       return false;
-               *v = n->data;
-               tail.store(n, memory_order_relaxed);
-               delete (t);
+       bool dequeue(int *idx) {
+               node *tmp = head;
+               node *n = tmp->next.load(acquire);
+               if (NULL == n) return false;
+               head = n;
+               *idx = n->index.load(relaxed);
+               delete (tmp);
                return true;
        }
 };