X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=blobdiff_plain;f=benchmark%2Fms-queue%2Fmy_queue.h;h=0768428df5d9fadc1a1b29195b3de2c94068e87b;hp=c92e420657c1847ec3575156be8e6a7b133e2dae;hb=375b8b02ae398aceddb920e0e7e94287e33f231e;hpb=18609d4482268ee61246f182a6a5cb1144e34573 diff --git a/benchmark/ms-queue/my_queue.h b/benchmark/ms-queue/my_queue.h index c92e420..0768428 100644 --- a/benchmark/ms-queue/my_queue.h +++ b/benchmark/ms-queue/my_queue.h @@ -1,5 +1,15 @@ +#ifndef _MY_QUEUE_H +#define _MY_QUEUE_H + #include +#include +#include +#include +#include +#include +#include "common.h" + #define MAX_NODES 0xf typedef unsigned long long pointer; @@ -26,6 +36,87 @@ typedef struct { } queue_t; void init_queue(queue_t *q, int num_threads); + +/** + @Begin + @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; + @InitVar: + __queue = new_spec_list(); + 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*) 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; + } + @DefineFunc: + unsigned int get_data(void *wrapper) { + return ((tag_elem_t*) wrapper)->data; + } + @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 + @End +*/ + + + +/** + @Begin + @Interface: Enqueue + @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); -unsigned int dequeue(queue_t *q); + +/** + @Begin + @Interface: Dequeue + @Commit_point_set: Dequeue_Read_Head | Dequeue_Read_Tail | Dequeue_LoadNext + @ID: get_id(front(__queue)) + @Action: + 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 == 0 ? !__RET__ : _Old_Val == *retVal + @End +*/ +bool dequeue(queue_t *q, int *retVal); int get_thread_num(); + +#endif