X-Git-Url: http://demsky.eecs.uci.edu/git/?p=model-checker-benchmarks.git;a=blobdiff_plain;f=treiber-stack%2Fmy_stack.h;fp=treiber-stack%2Fmy_stack.h;h=8d4d789ef7da1fdbf3a506c24764e09906c29bfe;hp=0000000000000000000000000000000000000000;hb=e326d381460902d927b8862149ce5382f8509bbd;hpb=f19c4f0d0d8c054fdea82137c57dc0dca3059704 diff --git a/treiber-stack/my_stack.h b/treiber-stack/my_stack.h new file mode 100644 index 0000000..8d4d789 --- /dev/null +++ b/treiber-stack/my_stack.h @@ -0,0 +1,35 @@ +#include + +#define release memory_order_release +#define acquire memory_order_acquire +#define relaxed memory_order_relaxed + +#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 top; + node_t nodes[MAX_NODES + 1]; +} stack_t; + +void init_stack(stack_t *s, int num_threads); +void push(stack_t *s, unsigned int val); +unsigned int pop(stack_t *s); +int get_thread_num();