#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;
}
};