changes to the spec of deque
[cdsspec-compiler.git] / benchmark / chase-lev-deque-bugfix / deque.h
index b046cc7b7cc0d11af1d578be663ff067c39ae60a..7d2df9f18e1732d7e2909cf5ec89faaa7b9afd0b 100644 (file)
@@ -1,5 +1,6 @@
 #ifndef DEQUE_H
 #define DEQUE_H
+
 #include <spec_lib.h>
 #include <stdlib.h>
 #include <cdsannotate.h>
@@ -46,11 +47,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
@@ -65,13 +72,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__
@@ -82,7 +92,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);
@@ -94,16 +104,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);