#include <stdatomic.h>
+#include <spec_lib.h>
+#include <stdlib.h>
+#include <cdsannotate.h>
+#include <specannotation.h>
+#include <model_memory.h>
+#include "common.h"
+
#define MAX_NODES 0xf
typedef unsigned long long pointer;
void init_queue(queue_t *q, int num_threads);
-#include <list>
-using namespace std;
/**
@Begin
+ @Options:
+ LANG = C;
@Global_define:
- @DeclareStruct:
- typedef struct tag_elem {
- Tag id;
- unsigned int data;
- } tag_elem_t;
-
@DeclareVar:
- list<tag_elem_t> __queue;
- Tag tag;
+ IntegerList *__queue;
@InitVar:
- __queue = list<tag_elem_t>();
- tag = 1; // Beginning of available id
- @Happens_before:
- # Only check the happens-before relationship according to the id of the
- # commit_point_set. For commit_point_set that has same ID, A -> B means
- # B happens after the previous A.
- Enqueue -> Dequeue
+ __queue = createIntegerList();
+ @Finalize:
+ if (__queue)
+ destroyIntegerList(__queue);
+ return true;
+ @Happens_before: Enqueue -> Dequeue
+ @Commutativity: Enqueue <-> Dequeue: true
+ @Commutativity: Dequeue <-> Dequeue: !_Method1.__RET__ || !_Method2.__RET__
+ //@Commutativity: Enqueue <-> Enqueue: _Method1.q != _Method2.q
+ //@Commutativity: Dequeue <-> Dequeue: _Method1.q != _Method2.q
@End
*/
/**
@Begin
@Interface: Enqueue
- @Commit_point_set: Enqueue_Success_Point
- @ID: tag++
+ @Commit_point_set: EnqueueUpdateNext
+ @ID: val
@Action:
# __ID__ is an internal macro that refers to the id of the current
# interface call
- tag_elem_t elem;
- elem.id = __ID__;
- elem.data = val;
- __queue.push_back(elem);
+ push_back(__queue, val);
+ //model_print("Enqueue: val=%d\n", val);
@End
*/
void enqueue(queue_t *q, unsigned int val);
/**
@Begin
@Interface: Dequeue
- @Commit_point_set: Dequeue_Success_Point
- @ID: __queue.back().id
+ @Commit_point_set: DequeueReadHead | DequeueUpdateHead | DequeueReadNextVerify
+ @ID: __RET__ ? *retVal : 0
@Action:
- unsigned int _Old_Val = __queue.front().data;
- __queue.pop_front();
- @Post_check:
- _Old_Val == __RET__
+ int elem = 0;
+ if (__RET__) {
+ elem = front(__queue);
+ pop_front(__queue);
+ }
+ //model_print("Dequeue: __RET__=%d, retVal=%d, elem=%d, \n", __RET__, *retVal, elem);
+ //model_print("Result: %d\n", __RET__ ? *retVal == elem : true);
+ @Post_check: __RET__ ? *retVal == elem : true
@End
*/
-unsigned int dequeue(queue_t *q);
+bool dequeue(queue_t *q, int *retVal);
int get_thread_num();
#endif