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=bc670e7ef1e540d56b2e043fe1b11b48f396b91a;hb=7b00825b34d57a9ae4db2a46b5c77f46753e1749;hpb=0a040a5b619952d29338f73db8f685d7367178fc diff --git a/benchmark/chase-lev-deque-bugfix/deque.h b/benchmark/chase-lev-deque-bugfix/deque.h index bc670e7..e652f22 100644 --- a/benchmark/chase-lev-deque-bugfix/deque.h +++ b/benchmark/chase-lev-deque-bugfix/deque.h @@ -1,6 +1,13 @@ #ifndef DEQUE_H #define DEQUE_H +#include +#include +#include +#include +#include +#include "common.h" + typedef struct { atomic_size_t size; atomic_int buffer[]; @@ -11,12 +18,82 @@ typedef struct { atomic_uintptr_t array; /* Atomic(Array *) */ } Deque; +#define EMPTY 0xffffffff +#define ABORT 0xfffffffe + +/** + @Begin + @Options: + LANG = C; + @Global_define: + @DeclareVar: + IntegerList *__deque; + @InitVar: + __deque = createIntegerList(); + @Finalize: + if (__deque) + destroyIntegerList(__deque); + return true; + @DefineFunc: + bool succ(int res) { + return res != EMPTY && res != ABORT; + } + @Happens_before: + Push -> Steal + @Commutativity: Push <-> Steal: true + @Commutativity: Take <-> Steal: true + + @End +*/ + + Deque * create(); -int take(Deque *q); void resize(Deque *q); + +/** + @Begin + @Interface: Take + @Commit_point_set: TakeReadBottom | TakeReadBuffer | TakeReadTop + @ID: succ(__RET__) ? __RET__ : DEFAULT_CALL_ID + @Action: + int elem = 0; + if (succ(__RET__)) { + elem = back(__deque); + pop_back(__deque); + //model_print("take: elem=%d, __RET__=%d\n", elem, __RET__); + } + @Post_check: succ(__RET__) ? __RET__ == elem : true + @End +*/ +int take(Deque *q); + +/** + @Begin + @Interface: Push + @Commit_point_set: PushUpdateBuffer + @ID: x + @Action: + push_back(__deque, x); + //model_print("push: elem=%d\n", x); + @End +*/ void push(Deque *q, int x); -#define EMPTY 0xffffffff -#define ABORT 0xfffffffe +/** + @Begin + @Interface: Steal + @Commit_point_set: StealReadTop1 | StealReadTop2 | StealReadBuffer + @ID: succ(__RET__) ? __RET__ : DEFAULT_CALL_ID + @Action: + int elem = 0; + if (succ(__RET__)) { + elem = front(__deque); + pop_front(__deque); + //model_print("steal: elem=%d, __RET__=%d\n", elem, __RET__); + } + @Post_check: succ(__RET__) ? __RET__ == elem : true + @End +*/ +int steal(Deque *q); #endif