X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=benchmark%2Fchase-lev-deque-bugfix%2Fdeque.h;h=f188a8fd9657c18888a4fcd93ab04a18eead3cc7;hb=60246219b510f28980a6f93f615458e41262a23f;hp=fa76d8dc4e7073e52fc72c234430e21c6d219a7c;hpb=010b0488385988be23280784a128f5ba778e193a;p=cdsspec-compiler.git diff --git a/benchmark/chase-lev-deque-bugfix/deque.h b/benchmark/chase-lev-deque-bugfix/deque.h index fa76d8d..f188a8f 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[]; @@ -29,8 +36,13 @@ typedef struct { spec_list *__deque; id_tag_t *tag; @InitVar: - __deque= new_spec_list(); + __deque = new_spec_list(); tag = new_id_tag(); // Beginning of available id + @Cleanup: + if (__deque) + free_spec_list(__deque); + if (tag) + free_id_tag(); @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)); @@ -40,11 +52,17 @@ typedef struct { } @DefineFunc: call_id_t get_id(void *wrapper) { - return ((tag_elem_t*) wrapper)->id; + tag_elem_t *res = (tag_elem_t*) wrapper; + if (res == NULL) { + //model_print("wrong id here\n"); + return 0; + } + return res->id; } @DefineFunc: int get_data(void *wrapper) { - return ((tag_elem_t*) wrapper)->data; + tag_elem_t *res = (tag_elem_t*) wrapper; + return res->data; } @Happens_before: Push -> Steal @@ -59,13 +77,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: Take_Read_Bottom | Take_CAS_Top | Take_Additional_Point + @Commit_point_set: Take_Read_Bottom | Take_Additional_Point + @ID: __RET__ == EMPTY ? DEFAULT_CALL_ID : get_id(back(__deque)) @Action: int _Old_Val = EMPTY; - if (size(__deque) > 0) { - _Old_Val = get_data(back(__deque)); - pop_back(__deque); + if (__RET__ != EMPTY) { + if (size(__deque) > 0) { + _Old_Val = get_data(back(__deque)); + pop_back(__deque); + } } @Post_check: _Old_Val == __RET__ @@ -76,7 +97,7 @@ int take(Deque *q); /** @Begin @Interface: Push - @Commit_point_set: Push_Point + @Commit_point_set: Push_Update_Bottom @ID: get_and_inc(tag); @Action: tag_elem_t *elem = new_tag_elem(__ID__, x); @@ -88,16 +109,19 @@ 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: Steal_Read_Bottom | Steal_CAS_Top | Steal_Additional_Point + @Commit_point_set: Steal_Read_Bottom | Steal_Additional_Point + @ID: (__RET__ == EMPTY || __RET__ == ABORT) ? DEFAULT_CALL_ID : get_id(front(__deque)) @Action: int _Old_Val = EMPTY; - if (size(__deque) > 0) { - _Old_Val = get_data(front(__deque)); - pop_front(__deque); + if (__RET__ != EMPTY && __RET__ != ABORT) { + if (size(__deque) > 0) { + _Old_Val = get_data(front(__deque)); + pop_front(__deque); + } } @Post_check: - _Old_Val == __RET__ + _Old_Val == __RET__ || __RET__ == EMPTY || __RET__ == ABORT @End */ int steal(Deque *q);