X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=blobdiff_plain;f=benchmark%2Fspsc-bugfix%2Fqueue.h;h=8ff765e66cf0d95ab34227f22ab06053eed36f04;hp=802d455323d48e05656ac7bb4270b7de96b73edf;hb=b779fde36fd5836709293c63945964d8c42cee1f;hpb=0a040a5b619952d29338f73db8f685d7367178fc diff --git a/benchmark/spsc-bugfix/queue.h b/benchmark/spsc-bugfix/queue.h index 802d455..8ff765e 100644 --- a/benchmark/spsc-bugfix/queue.h +++ b/benchmark/spsc-bugfix/queue.h @@ -1,34 +1,32 @@ +#ifndef _QUEUE_H +#define _QUEUE_H + #include #include #include "eventcount.h" +/** + @Begin + @Class_begin + @End +*/ template class spsc_queue { - /** - @Begin - @Global_define: - typedef struct tag_elem { - Tag id; - T data; - } tag_elem_t; - - Tag tag; - spec_queue __queue; - - static bool _is_elem_equals(void *ptr1, void *ptr2) { - // ... - // return if the elements pointed to are equal - } - - @Happens-before: - Enqueue -> Dequeue - @End - **/ + public: + + spsc_queue() { + + /** + @Begin + @Entry_point + @End + */ + node* n = new node (); head = n; tail = n; @@ -39,15 +37,54 @@ public: RL_ASSERT(head == tail); delete ((node*)head($)); } + + /** + @Begin + @Options: + LANG = CPP; + CLASS = spsc_queue; + @Global_define: + @DeclareStruct: + typedef struct tag_elem { + call_id_t id; + T data; + } tag_elem_t; + + @DeclareVar: + spec_list *__queue; + id_tag_t *tag; + @InitVar: + __queue = new_spec_list(); + tag = new_id_tag(); + @DefineFunc: + tag_elem_t* new_tag_elem(call_id_t id, T data) { + tag_elem_t *e = (tag_elem_t*) MODEL_MALLOC(sizeof(tag_elem_t)); + e->id = id; + e->data = data; + return e; + } + @DefineFunc: + call_id_t get_id(void *wrapper) { + return ((tag_elem_t*) wrapper)->id; + } + @DefineFunc: + unsigned int get_data(void *wrapper) { + return ((tag_elem_t*) wrapper)->data; + } + @Happens_before: + Enqueue -> Dequeue + @End + */ + /** @Begin - @Commit_point_set: - Enqueue = Enqueue_Success_Point - @ID: tag.current() + @Interface: Enqueue + @Commit_point_set: Enqueue_Point + @ID: get_and_inc(tag) @Action: - __queue.enqueue(tag_elem_t(tag.current(), node(data)); - tag.next(); + tag_elem_t *elem = new_tag_elem(__ID__, data); + push_back(__queue, elem); @End */ void enqueue(T data) @@ -56,22 +93,24 @@ public: head($)->next.store(n, std::memory_order_release); /** @Begin - @Commit_point_define: true - @Label: Enqueue_Success_Point + @Commit_point_define_check: true + @Label: Enqueue_Point @End */ head = n; // #Mark delete this ec.signal(); } - /** @Begin - @Commit_point_set: - Dequeue = Try_Dequeue_Success_Point - @ID: __queue.peak().tag - @Check: __queue.size() > 0 && _is_elem_equals(&RET, &__queue.peek().data) - @Action: __queue.dequeue(); + @Interface: Dequeue + @Commit_point_set: Dequeue_Point + @ID: get_id(front(__queue)) + @Action: + T _Old_Val = get_data(front(__queue)); + pop_front(__queue); + @Post_check: + _Old_Val == __RET__ @End */ T dequeue() @@ -115,8 +154,8 @@ private: node* n = t->next.load(std::memory_order_acquire); /** @Begin - @Commit_point_define: ATOMIC_RET != NULL - @Label: Try_Dequeue_Success_Point + @Commit_point_define_check: n != 0 + @Label: Dequeue_Point @End */ if (0 == n) @@ -127,3 +166,10 @@ private: return data; } }; +/** + @Begin + @Class_end + @End +*/ + +#endif