more fix
[cdsspec-compiler.git] / benchmark / chase-lev-deque-bugfix / deque.h
1 #ifndef DEQUE_H
2 #define DEQUE_H
3 #include <spec_lib.h>
4 #include <stdlib.h>
5 #include <cdsannotate.h>
6 #include <specannotation.h>
7 #include <model_memory.h>
8
9 typedef struct {
10         atomic_size_t size;
11         atomic_int buffer[];
12 } Array;
13
14 typedef struct {
15         atomic_size_t top, bottom;
16         atomic_uintptr_t array; /* Atomic(Array *) */
17 } Deque;
18
19 #define EMPTY 0xffffffff
20 #define ABORT 0xfffffffe
21
22 /**
23     @Begin
24     @Options:
25         LANG = C;
26     @Global_define:
27         @DeclareStruct:
28         typedef struct tag_elem {
29             call_id_t id;
30             int data;
31         } tag_elem_t;
32         
33         @DeclareVar:
34         spec_list *__deque;
35         id_tag_t *tag;
36         @InitVar:
37             __deque= new_spec_list();
38             tag = new_id_tag(); // Beginning of available id
39         @DefineFunc:
40             tag_elem_t* new_tag_elem(call_id_t id, int data) {
41                 tag_elem_t *e = (tag_elem_t*) CMODEL_MALLOC(sizeof(tag_elem_t));
42                 e->id = id;
43                 e->data = data;
44                 return e;
45             }
46         @DefineFunc:
47             call_id_t get_id(void *wrapper) {
48                 return ((tag_elem_t*) wrapper)->id;
49             }
50         @DefineFunc:
51             int get_data(void *wrapper) {
52                 return ((tag_elem_t*) wrapper)->data;
53             }
54     @Happens_before:
55         Push -> Steal
56                 Push -> Take
57     @End
58 */
59
60
61 Deque * create();
62 void resize(Deque *q);
63
64 /**
65     @Begin
66     @Interface: Take 
67     @Commit_point_set: Take_Point1 | Take_Point2 | Take_Point3 | Take_Point4
68     @ID: size(__deque) == 0 ? DEFAULT_CALL_ID : get_id(back(__deque))
69     @Action:
70         int _Old_Val = EMPTY;
71                 if (size(__deque) > 0) {
72                         _Old_Val = get_data(back(__deque));
73                 pop_back(__deque);
74                 }
75     @Post_check:
76         _Old_Val == __RET__
77     @End
78 */
79 int take(Deque *q);
80
81 /**
82     @Begin
83     @Interface: Push 
84     @Commit_point_set: Push_Point
85     @ID: get_and_inc(tag);
86     @Action:
87         tag_elem_t *elem = new_tag_elem(__ID__, x);
88         push_back(__deque, elem);
89     @End
90 */
91 void push(Deque *q, int x);
92
93 /**
94     @Begin
95     @Interface: Steal 
96     @Commit_point_set: Steal_Point1 | Steal_Point2 | Steal_Point3
97     @ID: size(__deque) == 0 ? DEFAULT_CALL_ID : get_id(front(__deque))
98     @Action:
99         int _Old_Val = EMPTY;
100                 if (size(__deque) > 0) {
101                         _Old_Val = get_data(front(__deque));
102                 pop_front(__deque);
103                 }
104     @Post_check:
105         _Old_Val == __RET__
106     @End
107 */
108 int steal(Deque *q);
109
110 #endif