edits
[cdsspec-compiler.git] / benchmark / ms-queue / my_queue.h
index 2da355a94c29bf05e2da8c3e3e06c1a3685fc2de..3d54e772d287f0da13ef3ff896cd3c62e8b9f8a3 100644 (file)
@@ -42,52 +42,19 @@ void init_queue(queue_t *q, int num_threads);
        @Options:
                LANG = C;
        @Global_define:
-               @DeclareStruct:
-               typedef struct tag_elem {
-                       call_id_t id;
-                       unsigned int data;
-               } tag_elem_t;
-               
                @DeclareVar:
-                       spec_list *__queue;
-                       id_tag_t *tag;
+                       IntegerList *__queue;
                @InitVar:
-                       __queue = new_spec_list();
-                       tag = new_id_tag(); // Beginning of available id
-               //@Cleanup:
-               //      if (__queue)
-               //              free_spec_list(__queue);
-               //      if (tag)
-               //              free_id_tag(tag);
-               @DefineFunc:
-                       tag_elem_t* new_tag_elem(call_id_t id, unsigned int data) {
-                               tag_elem_t *e = (tag_elem_t*) CMODEL_MALLOC(sizeof(tag_elem_t));
-                               e->id = id;
-                               e->data = data;
-                               return e;
-                       }
-               //@DefineFunc:
-               //      void free_tag_elem(tag_elem_t *e) {
-               //              free(e);
-               //      }
-               @DefineFunc:
-                       call_id_t get_id(void *wrapper) {
-               //              if (wrapper == NULL)
-               //                      return 0;
-               //              return ((tag_elem_t*) wrapper)->id;
-                               return wrapper == NULL ? 0 : ((tag_elem_t*) wrapper)->id;
-                       }
-               @DefineFunc:
-                       unsigned int get_data(void *wrapper) {
-                               return ((tag_elem_t*) wrapper)->data;
-                       }
+                       __queue = createIntegerList();
+               @Finalize:
+                       if (__queue)
+                               destroyIntegerList(__queue);
+                       return true;
        @Happens_before: Enqueue -> Dequeue
-               # 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.
        @Commutativity: Enqueue <-> Dequeue: true
-       @Commutativity: Enqueue <-> Enqueue: _Method1.q != _Method2.q
-       @Commutativity: Dequeue <-> Dequeue: _Method1.q != _Method2.q
+       @Commutativity: Dequeue <-> Dequeue: !_Method1.__RET__ || !_Method2.__RET__
+       //@Commutativity: Enqueue <-> Enqueue: _Method1.q != _Method2.q
+       //@Commutativity: Dequeue <-> Dequeue: _Method1.q != _Method2.q
        @End
 */
 
@@ -97,13 +64,12 @@ void init_queue(queue_t *q, int num_threads);
        @Begin
        @Interface: Enqueue
        @Commit_point_set: EnqueueUpdateNext
-       @ID: get_and_inc(tag)
+       @ID: val
        @Action:
                # __ID__ is an internal macro that refers to the id of the current
                # interface call
-               tag_elem_t *elem = new_tag_elem(__ID__, val);
-               push_back(__queue, elem);
-               //model_print("Enqueue: input=%d\n", val);
+               push_back(__queue, val);
+               //model_print("Enqueue: val=%d\n", val);
        @End
 */
 void enqueue(queue_t *q, unsigned int val);
@@ -112,15 +78,16 @@ void enqueue(queue_t *q, unsigned int val);
        @Begin
        @Interface: Dequeue
        @Commit_point_set: DequeueReadHead | DequeueUpdateHead | DequeueReadNextVerify
-       @ID: get_id(front(__queue))
+       @ID: __RET__ ? *retVal : 0
        @Action:
-               unsigned int _Old_Val = 0;
-               if (size(__queue) > 0) {
-                       _Old_Val = get_data(front(__queue));
+               int elem = 0;
+               if (__RET__) {
+                       elem = front(__queue);
                        pop_front(__queue);
                }
-       //      model_print("Dequeue: __RET__=%d, retVal=%d, Old_Val=%d\n", __RET__, *retVal, _Old_Val);
-       @Post_check: _Old_Val == 0 ? !__RET__ : _Old_Val == *retVal
+               //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
 */
 bool dequeue(queue_t *q, int *retVal);