8 #include <cdsannotate.h>
9 #include <specannotation.h>
10 #include <model_memory.h>
15 typedef unsigned long long pointer;
16 typedef atomic_ullong pointer_t;
18 #define MAKE_POINTER(ptr, count) ((((pointer)count) << 32) | ptr)
19 #define PTR_MASK 0xffffffffLL
20 #define COUNT_MASK (0xffffffffLL << 32)
22 static inline void set_count(pointer *p, unsigned int val) { *p = (*p & ~COUNT_MASK) | ((pointer)val << 32); }
23 static inline void set_ptr(pointer *p, unsigned int val) { *p = (*p & ~PTR_MASK) | val; }
24 static inline unsigned int get_count(pointer p) { return (p & COUNT_MASK) >> 32; }
25 static inline unsigned int get_ptr(pointer p) { return p & PTR_MASK; }
35 node_t nodes[MAX_NODES + 1];
38 void init_queue(queue_t *q, int num_threads);
48 __queue = createIntegerList();
51 destroyIntegerList(__queue);
53 @Happens_before: Enqueue -> Dequeue
54 @Commutativity: Enqueue <-> Dequeue: true
55 @Commutativity: Dequeue <-> Dequeue: !_Method1.__RET__ || !_Method2.__RET__
56 //@Commutativity: Enqueue <-> Enqueue: _Method1.q != _Method2.q
57 //@Commutativity: Dequeue <-> Dequeue: _Method1.q != _Method2.q
66 @Commit_point_set: EnqueueUpdateNext
69 # __ID__ is an internal macro that refers to the id of the current
71 push_back(__queue, val);
72 //model_print("Enqueue: val=%d\n", val);
75 void enqueue(queue_t *q, unsigned int val);
80 @Commit_point_set: DequeueReadHead | DequeueUpdateHead | DequeueReadNextVerify
81 @ID: __RET__ ? *retVal : 0
85 elem = front(__queue);
88 //model_print("Dequeue: __RET__=%d, retVal=%d, elem=%d, \n", __RET__, *retVal, elem);
89 //model_print("Result: %d\n", __RET__ ? *retVal == elem : true);
90 @Post_check: __RET__ ? *retVal == elem : true
93 bool dequeue(queue_t *q, int *retVal);