519e9e3a7bd17882f78a30724eec1da2a353b8db
[model-checker-benchmarks.git] / ms-queue / my_queue.h
1 #include <stdatomic.h>
2
3 #define TRUE                            1
4 #define FALSE                           0
5
6 #define MAX_NODES                       0xf
7 #define MAX_SERIAL                      10000
8
9 typedef unsigned long long pointer;
10 typedef atomic_ullong pointer_t;
11
12 #define MAKE_POINTER(ptr, count)        ((((pointer)count) << 32) | ptr)
13 #define PTR_MASK 0xffffffffLL
14 #define COUNT_MASK (0xffffffffLL << 32)
15
16 static inline void set_count(pointer *p, unsigned int val) { *p = (*p & ~COUNT_MASK) | ((pointer)val << 32); }
17 static inline void set_ptr(pointer *p, unsigned int val) { *p = (*p & ~PTR_MASK) | val; }
18 static inline unsigned int get_count(pointer p) { return p & PTR_MASK; }
19 static inline unsigned int get_ptr(pointer p) { return (p & COUNT_MASK) >> 32; }
20
21 typedef struct node {
22         unsigned int value;
23         pointer_t next;
24         unsigned int foo[30];
25 } node_t;
26
27 typedef struct private {
28         unsigned int node;
29         unsigned int value;
30         unsigned int serial[MAX_SERIAL];
31 } private_t;
32
33 typedef struct shared_mem {
34         pointer_t head;
35         unsigned int foo1[31];
36         pointer_t tail;
37         unsigned int foo2[31];
38         node_t nodes[MAX_NODES+1];
39         unsigned int serial;
40 } shared_mem_t;
41
42 void init_private(int pid);
43 void init_memory();
44 void init_queue();
45 unsigned int dequeue();