X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=blobdiff_plain;f=benchmark%2Fchase-lev-deque-bugfix%2Fdeque.h;h=e652f2236fc57929e9566782dec092d6eded227e;hp=8ddcdb6b27fb878b2a356acb086ab0a8ca3b8f81;hb=7b00825b34d57a9ae4db2a46b5c77f46753e1749;hpb=01b38b1079dea8b5d197bc246d7aced60496edff diff --git a/benchmark/chase-lev-deque-bugfix/deque.h b/benchmark/chase-lev-deque-bugfix/deque.h index 8ddcdb6..e652f22 100644 --- a/benchmark/chase-lev-deque-bugfix/deque.h +++ b/benchmark/chase-lev-deque-bugfix/deque.h @@ -1,10 +1,12 @@ #ifndef DEQUE_H #define DEQUE_H + #include #include #include #include #include +#include "common.h" typedef struct { atomic_size_t size; @@ -24,36 +26,23 @@ typedef struct { @Options: LANG = C; @Global_define: - @DeclareStruct: - typedef struct tag_elem { - call_id_t id; - int data; - } tag_elem_t; - @DeclareVar: - spec_list *__deque; - id_tag_t *tag; + IntegerList *__deque; @InitVar: - __deque= new_spec_list(); - tag = new_id_tag(); // Beginning of available id - @DefineFunc: - tag_elem_t* new_tag_elem(call_id_t id, int data) { - tag_elem_t *e = (tag_elem_t*) CMODEL_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: - int get_data(void *wrapper) { - return ((tag_elem_t*) wrapper)->data; - } + __deque = createIntegerList(); + @Finalize: + if (__deque) + destroyIntegerList(__deque); + return true; + @DefineFunc: + bool succ(int res) { + return res != EMPTY && res != ABORT; + } @Happens_before: Push -> Steal - Push -> Take + @Commutativity: Push <-> Steal: true + @Commutativity: Take <-> Steal: true + @End */ @@ -64,16 +53,16 @@ void resize(Deque *q); /** @Begin @Interface: Take - @Commit_point_set: Take_Point1 | Take_Point2 | Take_Point3 | Take_Point4 - @ID: size(__deque) == 0 ? DEFAULT_CALL_ID : get_id(back(__deque)) + @Commit_point_set: TakeReadBottom | TakeReadBuffer | TakeReadTop + @ID: succ(__RET__) ? __RET__ : DEFAULT_CALL_ID @Action: - int _Old_Val = EMPTY; - if (size(__deque) > 0) { - _Old_Val = get_data(back(__deque)); - pop_back(__deque); + int elem = 0; + if (succ(__RET__)) { + elem = back(__deque); + pop_back(__deque); + //model_print("take: elem=%d, __RET__=%d\n", elem, __RET__); } - @Post_check: - _Old_Val == __RET__ + @Post_check: succ(__RET__) ? __RET__ == elem : true @End */ int take(Deque *q); @@ -81,11 +70,11 @@ int take(Deque *q); /** @Begin @Interface: Push - @Commit_point_set: Push_Point - @ID: get_and_inc(tag); + @Commit_point_set: PushUpdateBuffer + @ID: x @Action: - tag_elem_t *elem = new_tag_elem(__ID__, x); - push_back(__deque, elem); + push_back(__deque, x); + //model_print("push: elem=%d\n", x); @End */ void push(Deque *q, int x); @@ -93,16 +82,16 @@ void push(Deque *q, int x); /** @Begin @Interface: Steal - @Commit_point_set: Steal_Point1 | Steal_Point2 | Steal_Point3 - @ID: size(__deque) == 0 ? DEFAULT_CALL_ID : get_id(front(__deque)) + @Commit_point_set: StealReadTop1 | StealReadTop2 | StealReadBuffer + @ID: succ(__RET__) ? __RET__ : DEFAULT_CALL_ID @Action: - int _Old_Val = EMPTY; - if (size(__deque) > 0) { - _Old_Val = get_data(front(__deque)); - pop_front(__deque); + int elem = 0; + if (succ(__RET__)) { + elem = front(__deque); + pop_front(__deque); + //model_print("steal: elem=%d, __RET__=%d\n", elem, __RET__); } - @Post_check: - _Old_Val == __RET__ + @Post_check: succ(__RET__) ? __RET__ == elem : true @End */ int steal(Deque *q);