8 typedef unsigned long long pointer;
9 typedef atomic_ullong pointer_t;
11 #define MAKE_POINTER(ptr, count) ((((pointer)count) << 32) | ptr)
12 #define PTR_MASK 0xffffffffLL
13 #define COUNT_MASK (0xffffffffLL << 32)
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; }
28 node_t nodes[MAX_NODES + 1];
31 void init_queue(queue_t *q, int num_threads);
37 typedef struct tag_elem {
46 __queue = new_spec_list();
47 tag = new_id_tag(); // Beginning of available id
49 tag_elem_t* new_tag_elem(call_id_t id, unsigned int data) {
50 tag_elem_t *e = (tag_elem_t*) malloc(sizeof(tag_elem_t));
56 void free_tag_elem(tag_elem_t *e) {
60 call_id_t get_id(void *wrapper) {
61 return ((tag_elem_t*) wrapper)->id;
64 unsigned int get_data(void *wrapper) {
65 return ((tag_elem_t*) wrapper)->data;
68 # Only check the happens-before relationship according to the id of the
69 # commit_point_set. For commit_point_set that has same ID, A -> B means
70 # B happens after the previous A.
80 @Commit_point_set: Enqueue_Success_Point
81 @ID: get_and_inc(tag);
83 # __ID__ is an internal macro that refers to the id of the current
85 tag_elem_t *elem = new_tag_elem(__ID__, val);
86 push_back(__queue, elem);
89 void enqueue(queue_t *q, unsigned int val);
94 @Commit_point_set: Dequeue_Success_Point
95 @ID: get_id(back(__queue))
97 unsigned int _Old_Val = get_data(front(__queue));
103 unsigned int dequeue(queue_t *q);
104 int get_thread_num();