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