changes
[cdsspec-compiler.git] / benchmark / ms-queue / my_queue.h
index 6f4685de6295b3deb90690f9714f755b3e2e2f30..90f57755d74dfe261330c73ef77139a10533ced6 100644 (file)
@@ -3,6 +3,13 @@
 
 #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;
@@ -32,6 +39,8 @@ void init_queue(queue_t *q, int num_threads);
 
 /**
        @Begin
+       @Options:
+               LANG = C;
        @Global_define:
                @DeclareStruct:
                typedef struct tag_elem {
@@ -47,7 +56,7 @@ void init_queue(queue_t *q, int num_threads);
                        tag = new_id_tag(); // Beginning of available id
                @DefineFunc:
                        tag_elem_t* new_tag_elem(call_id_t id, unsigned int data) {
-                               tag_elem_t *e = (tag_elem_t*) malloc(sizeof(tag_elem_t));
+                               tag_elem_t *e = (tag_elem_t*) CMODEL_MALLOC(sizeof(tag_elem_t));
                                e->id = id;
                                e->data = data;
                                return e;
@@ -58,6 +67,8 @@ void init_queue(queue_t *q, int num_threads);
                        }
                @DefineFunc:
                        call_id_t get_id(void *wrapper) {
+                               if (wrapper == NULL)
+                                       return 0;
                                return ((tag_elem_t*) wrapper)->id;
                        }
                @DefineFunc:
@@ -77,13 +88,14 @@ void init_queue(queue_t *q, int num_threads);
 /**
        @Begin
        @Interface: Enqueue
-       @Commit_point_set: Enqueue_Success_Point
-       @ID: get_and_inc(tag);
+       @Commit_point_set: Enqueue_Read_Tail | Enqueue_UpdateNext
+       @ID: get_and_inc(tag)
        @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);
        @End
 */
 void enqueue(queue_t *q, unsigned int val);
@@ -91,16 +103,20 @@ void enqueue(queue_t *q, unsigned int val);
 /**
        @Begin
        @Interface: Dequeue
-       @Commit_point_set: Dequeue_Success_Point
-       @ID: get_id(back(__queue))
+       @Commit_point_set: Dequeue_Read_Head | Dequeue_Read_Tail | Dequeue_LoadNext
+       @ID: get_id(front(__queue))
        @Action:
-               unsigned int _Old_Val = get_data(front(__queue));
-               pop_front(__queue);
+               unsigned int _Old_Val = 0;
+               if (size(__queue) > 0) {
+                       _Old_Val = get_data(front(__queue));
+                       pop_front(__queue);
+               }
+               model_print("Dequeue: __RET__=%d, retVal=%d, Old_Val=%d\n", __RET__, *retVal, _Old_Val);
        @Post_check:
-               _Old_Val == __RET__
+               _Old_Val == 0 ? !__RET__ : _Old_Val == *retVal
        @End
 */
-unsigned int dequeue(queue_t *q);
+bool dequeue(queue_t *q, int *retVal);
 int get_thread_num();
 
 #endif