changes
authorPeizhao Ou <peizhaoo@uci.edu>
Tue, 17 Mar 2015 01:35:44 +0000 (18:35 -0700)
committerPeizhao Ou <peizhaoo@uci.edu>
Tue, 17 Mar 2015 01:35:44 +0000 (18:35 -0700)
Makefile
spsc-example/queue.h
spsc-example/spsc-queue.cc

index b681de1b5689cbc2e04542cd06f5217793916c53..e89a8f2bccb9f3102e1209707f9d7a44a564efb2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 DIRS := barrier mcs-lock mpmc-queue spsc-queue spsc-bugfix linuxrwlocks \
        dekker-fences chase-lev-deque ms-queue chase-lev-deque-bugfix \
-       concurrent-hashmap seqlock
+       concurrent-hashmap seqlock spsc-example
 
 .PHONY: $(DIRS)
 
index 76430e73d01fec8fa4c31248b5eda3a88275bac7..94f98e2782533d351bba55b424d6a2d8a4a2e307 100644 (file)
@@ -1,14 +1,16 @@
 #include <unrelacy.h>
 #include <atomic>
+#include "wildcard.h"
 
 using namespace std;
 
 struct node {
-       node(int d): data(d) {
-               next.store(0, memory_order_relaxed);
+       node(int d) {
+               data.store(0, memory_order_normal);
+               next.store(0, wildcard(1));
        }
        atomic<node*> next;
-       int data;
+       atomic_int data;
 };
 
 class spsc_queue
@@ -21,18 +23,18 @@ class spsc_queue
 
        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);
+               node *h = head.load(wildcard(2)); 
+               h->next.store(n, wildcard(3));
+               head.store(n, wildcard(4));
        }
 
        bool dequeue(int *v) {
-               node* t = tail.load(memory_order_relaxed);
-               node* n = t->next.load(memory_order_acquire);
+               node* t = tail.load(wildcard(5));
+               node* n = t->next.load(wildcard(6));
                if (0 == n)
                        return false;
-               *v = n->data;
-               tail.store(n, memory_order_relaxed);
+               *v = n->data.load(memory_order_normal);
+               tail.store(n, wildcard(7));
                delete (t);
                return true;
        }
index dc2a53cf40a77e9b00e843303434ead9a1adad1b..9f688c491f023328c363796a8128b0b738f41c21 100644 (file)
@@ -1,40 +1,38 @@
 #include <threads.h>
 #include <atomic>
 
-//#include "queue.h"
+#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, relaxed);
+       node(int d) {
+               data.store(d, memory_order_normal);
+               next.store(0, wildcard(1));
        }
        atomic<node*> next;
-       int data;
+       atomic_int data;
 };
 
 class spsc_queue { 
        atomic<node*> head, tail;/*@ \label{line:spscBegin} @*/
        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(relaxed); 
-               h->next.store(n, release);/*@ \label{line:spscRelease} @*/
-               head.store(n, relaxed);
+               node *h = head.load(wildcard(2)); 
+               h->next.store(n, wildcard(3));/*@ \label{line:spscRelease} @*/
+               head.store(n, wildcard(4));
        }
        bool dequeue(int *v) {
-               node* t = tail.load(relaxed);
-               node* n = t->next.load(acquire);/*@ \label{line:spscAcquire} @*/
+               node* t = tail.load(wildcard(5));
+               node* n = t->next.load(wildcard(6));/*@ \label{line:spscAcquire} @*/
                if (0 == n)
                        return false;
-               *v = n->data;
-               tail.store(n, relaxed);
+               *v = n->data.load(memory_order_normal);
+               tail.store(n, wildcard(7));
                delete (t);
                return true;
        }