The CDSSpec checker's benchmarks
[model-checker-benchmarks.git] / ms-queue / queue.h
diff --git a/ms-queue/queue.h b/ms-queue/queue.h
new file mode 100644 (file)
index 0000000..f6d12d2
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _QUEUE_H
+#define _QUEUE_H
+
+#include <stdatomic.h>
+
+#define MAX_NODES                      0xf
+
+typedef unsigned long long pointer;
+typedef atomic_ullong pointer_t;
+
+#define MAKE_POINTER(ptr, count)       ((((pointer)count) << 32) | ptr)
+#define PTR_MASK 0xffffffffLL
+#define COUNT_MASK (0xffffffffLL << 32)
+
+static inline void set_count(pointer *p, unsigned int val) { *p = (*p & ~COUNT_MASK) | ((pointer)val << 32); }
+static inline void set_ptr(pointer *p, unsigned int val) { *p = (*p & ~PTR_MASK) | val; }
+static inline unsigned int get_count(pointer p) { return (p & COUNT_MASK) >> 32; }
+static inline unsigned int get_ptr(pointer p) { return p & PTR_MASK; }
+
+typedef struct node {
+       unsigned int value;
+       pointer_t next;
+} node_t;
+
+typedef struct {
+       pointer_t head;
+       pointer_t tail;
+       node_t nodes[MAX_NODES + 2];
+} queue_t;
+
+void init_queue(queue_t *q, int num_threads);
+void enqueue(queue_t *q, unsigned int val, int n);
+int dequeue(queue_t *q, unsigned int *retVal, unsigned int *reclaimedNode);
+
+int get_thread_num();
+
+#endif