The CDSSpec checker's benchmarks
[model-checker-benchmarks.git] / ms-queue / queue.h
1 #ifndef _QUEUE_H
2 #define _QUEUE_H
3
4 #include <stdatomic.h>
5
6 #define MAX_NODES                       0xf
7
8 typedef unsigned long long pointer;
9 typedef atomic_ullong pointer_t;
10
11 #define MAKE_POINTER(ptr, count)        ((((pointer)count) << 32) | ptr)
12 #define PTR_MASK 0xffffffffLL
13 #define COUNT_MASK (0xffffffffLL << 32)
14
15 static inline void set_count(pointer *p, unsigned int val) { *p = (*p & ~COUNT_MASK) | ((pointer)val << 32); }
16 static inline void set_ptr(pointer *p, unsigned int val) { *p = (*p & ~PTR_MASK) | val; }
17 static inline unsigned int get_count(pointer p) { return (p & COUNT_MASK) >> 32; }
18 static inline unsigned int get_ptr(pointer p) { return p & PTR_MASK; }
19
20 typedef struct node {
21         unsigned int value;
22         pointer_t next;
23 } node_t;
24
25 typedef struct {
26         pointer_t head;
27         pointer_t tail;
28         node_t nodes[MAX_NODES + 2];
29 } queue_t;
30
31 void init_queue(queue_t *q, int num_threads);
32 void enqueue(queue_t *q, unsigned int val, int n);
33 int dequeue(queue_t *q, unsigned int *retVal, unsigned int *reclaimedNode);
34
35 int get_thread_num();
36
37 #endif