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