another benchmark
[satcheck.git] / benchmarks / satcheck / trieber-stack / trieber-stack.h
1 #include <stdatomic.h>
2
3 #define release memory_order_release 
4 #define acquire memory_order_acquire 
5 #define relaxed memory_order_relaxed
6
7 #define MAX_NODES                       0xf
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 & COUNT_MASK) >> 32; }
19 static inline unsigned int get_ptr(pointer p) { return p & PTR_MASK; }
20
21 typedef struct node {
22         unsigned int value;
23         pointer_t next;
24 } node_t;
25
26 typedef struct {
27         pointer_t top;
28         node_t nodes[MAX_NODES + 1];
29 } stack_t;
30
31 void init_stack(stack_t *s, int num_threads);
32 void push(stack_t *s, unsigned int val);
33 unsigned int pop(stack_t *s);
34 int get_thread_num();