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