4 //#include "wildcard.h"
7 #define acquire memory_order_acquire
8 #define release memory_order_release
9 #define relaxed memory_order_relaxed
13 index.store(idx, relaxed);
14 next.store(NULL, relaxed);
16 atomic<node*> next;/*@ \label{line:spscNodeNext} @*/
17 atomic<int> index;/*@ \label{line:spscNodeIndex} @*/
18 };/*@ \label{line:spscNodeEnd} @*/
20 class spsc_queue {/*@ \label{line:spscBegin} @*/
24 head = tail = new node(-1);
26 void enqueue(int idx) {
27 node* n = new node(idx);
28 tail->next.store(n, relaxed); // Should be release/*@ \label{line:spscRelease} @*/
31 bool dequeue(int *idx) {
33 node *n = tmp->next.load(relaxed); // Should be acquire/*@ \label{line:spscAcquire} @*/
34 if (NULL == n) return false;
36 *idx = n->index.load(relaxed);
40 };/*@ \label{line:spscEnd} @*/
42 spsc_queue *q;/*@ \label{line:testcaseBegin} @*/
44 void thrd1() { // Thread 1/*@ \label{line:thrd1} @*/
45 arr[1].store(47, relaxed);/*@ \label{line:spscRelaxedStore} @*/
48 void thrd2() { // Thread 2/*@ \label{line:thrd2} @*/
51 arr[idx].load(relaxed);/*@ \label{line:spscRelaxedLoad} @*/
52 }/*@ \label{line:testcaseEnd} @*/
54 int user_main(int argc, char **argv)
58 thrd_create(&A, (thrd_start_t)&thrd1, NULL);
59 thrd_create(&B, (thrd_start_t)&thrd2, NULL);