spsc example
[model-checker-benchmarks.git] / spsc-example / queue.h
1 #include <unrelacy.h>
2 #include <atomic>
3
4 using namespace std;
5
6 struct node {
7         node(int d): data(d) {
8                 next.store(0, memory_order_relaxed);
9         }
10         atomic<node*> next;
11         int data;
12 };
13
14 class spsc_queue
15 {
16         atomic<node*> head, tail;
17         public:
18         spsc_queue() {
19                 head = tail = new node(0);
20         }
21
22         void enqueue(int val) {
23                 node* n = new node(val);
24                 node *h = head.load(memory_order_relaxed); 
25                 h->next.store(n, memory_order_release);
26                 head.store(n, memory_order_relaxed);
27         }
28
29         bool dequeue(int *v) {
30                 node* t = tail.load(memory_order_relaxed);
31                 node* n = t->next.load(memory_order_acquire);
32                 if (0 == n)
33                         return false;
34                 *v = n->data;
35                 tail.store(n, memory_order_relaxed);
36                 delete (t);
37                 return true;
38         }
39 };