source: tests/unified_locking/locks.cfa@ b71b6df

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since b71b6df was 22b7579, checked in by Thierry Delisle <tdelisle@…>, 4 years ago

Changed is_blocking_lock trait to use on_wakeup.
Fixed fast_lock to work with conditions.

  • Property mode set to 100644
File size: 6.2 KB
Line 
1#include <stdio.h>
2#include "locks.hfa"
3#include <stdlib.hfa>
4#include <thread.hfa>
5
6const unsigned int num_times = 50000;
7
8multiple_acquisition_lock m;
9condition_variable( multiple_acquisition_lock ) c_m;
10
11single_acquisition_lock s;
12condition_variable( single_acquisition_lock ) c_s;
13
14owner_lock o;
15condition_variable( owner_lock ) c_o;
16
17fast_lock f;
18condition_variable( fast_lock ) c_f;
19
20thread T_C_M_WS1 {};
21
22void main( T_C_M_WS1 & this ) {
23 for (unsigned int i = 0; i < num_times; i++) {
24 lock(m);
25 if(empty(c_m) && i != num_times - 1) {
26 wait(c_m,m);
27 }else{
28 notify_one(c_m);
29 }
30 unlock(m);
31 }
32}
33
34thread T_C_M_WB1 {};
35
36void main( T_C_M_WB1 & this ) {
37 for (unsigned int i = 0; i < num_times; i++) {
38 lock(m);
39 if(counter(c_m) == 3 || i == num_times - 1) {
40 notify_all(c_m);
41 }else{
42 wait(c_m,m);
43 }
44 unlock(m);
45 }
46}
47
48thread T_C_S_WS1 {};
49
50void main( T_C_S_WS1 & this ) {
51 for (unsigned int i = 0; i < num_times; i++) {
52 lock(s);
53 if(empty(c_s) && i != num_times - 1) {
54 wait(c_s,s);
55 }else{
56 notify_one(c_s);
57 }
58 unlock(s);
59 }
60}
61
62thread T_C_S_WB1 {};
63
64void main( T_C_S_WB1 & this ) {
65 for (unsigned int i = 0; i < num_times; i++) {
66 lock(s);
67 if(counter(c_s) == 3 || i == num_times - 1) {
68 notify_all(c_s);
69 }else{
70 wait(c_s,s);
71 }
72 unlock(s);
73 }
74}
75
76thread T_C_F_WS1 {};
77
78void main( T_C_F_WS1 & this ) {
79 for (unsigned int i = 0; i < num_times; i++) {
80 lock(f);
81 if(empty(c_f) && i != num_times - 1) {
82 wait(c_f,f);
83 }else{
84 notify_one(c_f);
85 }
86 unlock(f);
87 }
88}
89
90thread T_C_F_WB1 {};
91
92void main( T_C_F_WB1 & this ) {
93 for (unsigned int i = 0; i < num_times; i++) {
94 lock(f);
95 if(counter(c_f) == 3 || i == num_times - 1) {
96 notify_all(c_f);
97 }else{
98 wait(c_f,f);
99 }
100 unlock(f);
101 }
102}
103
104thread T_C_O_WS1 {};
105
106void main( T_C_O_WS1 & this ) {
107 for (unsigned int i = 0; i < num_times; i++) {
108 lock(o);
109 if(empty(c_o) && i != num_times - 1) {
110 wait(c_o,o);
111 }else{
112 notify_one(c_o);
113 }
114 unlock(o);
115 }
116}
117
118thread T_C_O_WB1 {};
119
120void main( T_C_O_WB1 & this ) {
121 for (unsigned int i = 0; i < num_times; i++) {
122 lock(o);
123 if(counter(c_o) == 3 || i == num_times - 1) {
124 notify_all(c_o);
125 }else{
126 wait(c_o,o);
127 }
128 unlock(o);
129 }
130}
131
132thread T_C_M_WS2 {};
133
134void main( T_C_M_WS2 & this ) {
135 for (unsigned int i = 0; i < num_times; i++) {
136 lock(m);
137 lock(m);
138 lock(m);
139 if(empty(c_m) && i != num_times - 1) {
140 wait(c_m,m);
141 }else{
142 notify_one(c_m);
143 }
144 unlock(m);
145 unlock(m);
146 unlock(m);
147 }
148}
149
150thread T_C_O_WS2 {};
151
152void main( T_C_O_WS2 & this ) {
153 for (unsigned int i = 0; i < num_times; i++) {
154 lock(o);
155 lock(o);
156 lock(o);
157 if(empty(c_o) && i != num_times - 1) {
158 wait(c_o,o);
159 }else{
160 notify_one(c_o);
161 }
162 unlock(o);
163 unlock(o);
164 unlock(o);
165 }
166}
167
168thread T_C_NLW {};
169
170void main( T_C_NLW & this ) {
171 for (unsigned int i = 0; i < num_times; i++) {
172 wait(c_o);
173 }
174}
175
176thread T_C_NLS {};
177
178void main( T_C_NLS & this ) {
179 for (unsigned int i = 0; i < num_times; i++) {
180 while (empty(c_o)) { }
181 notify_one(c_o);
182 }
183}
184
185thread T_C_S_WNF {};
186
187void main( T_C_S_WNF & this ) {
188 for (unsigned int i = 0; i < num_times; i++) {
189 lock(s);
190 if(empty(c_s) && i != num_times - 1) {
191 wait(c_s, s, 10);
192 }else{
193 if(!empty(c_s)) assert(front(c_s) == 10);
194 notify_one(c_s);
195 }
196 unlock(s);
197 }
198}
199
200bool done = false;
201
202thread T_C_NLWD {};
203
204void main( T_C_NLWD & this ) {
205 done = false;
206 for (unsigned int i = 0; i < num_times/5; i++) {
207 if (i % 1000 == 0) printf("Iteration: %d\n", i);
208 wait(c_s, 1`ns);
209 }
210 done = true;
211}
212
213thread T_C_WDS {};
214
215void main( T_C_WDS & this ) {
216 for (unsigned int i = 0; i < num_times; i++) {
217 while (empty(c_s) && !done) { }
218 notify_one(c_s);
219 sleep(1`ns);
220 if(done) break;
221 }
222}
223
224thread T_C_LWD {};
225
226void main( T_C_LWD & this ) {
227 done = false;
228 for (unsigned int i = 0; i < num_times/5; i++) {
229 if (i % 1000 == 0) printf("Iteration: %d\n", i);
230 lock(s);
231 wait(c_s, s, 1`ns);
232 unlock(s);
233 }
234 done = true;
235}
236
237thread T_C_LWDS {};
238
239void main( T_C_LWDS & this ) {
240 for (unsigned int i = 0; i < num_times; i++) {
241 while (empty(c_s) && !done) { }
242 lock(s);
243 notify_one(c_s);
244 unlock(s);
245 sleep(1`ns);
246 if(done) break;
247 }
248}
249
250int main() {
251 processor p[2];
252 printf("Start Test 1: multi acquisition lock and condition variable single wait/notify\n");
253 {
254 T_C_M_WS1 t1[2];
255 }
256 printf("Done Test 1\n");
257
258 printf("Start Test 2: multi acquisition lock and condition variable 3 wait/notify all\n");
259 {
260 T_C_M_WB1 t1[4];
261 }
262 printf("Done Test 2\n");
263
264 printf("Start Test 3: single acquisition lock and condition variable single wait/notify\n");
265 {
266 T_C_S_WS1 t1[2];
267 }
268 printf("Done Test 3\n");
269
270 printf("Start Test 4: single acquisition lock and condition variable 3 wait/notify all\n");
271 {
272 T_C_S_WB1 t1[4];
273 }
274 printf("Done Test 4\n");
275
276 printf("Start Test 5: owner lock and condition variable single wait/notify\n");
277 {
278 T_C_O_WS1 t1[2];
279 }
280 printf("Done Test 5\n");
281
282 printf("Start Test 6: owner lock and condition variable 3 wait/notify all\n");
283 {
284 T_C_O_WB1 t1[4];
285 }
286 printf("Done Test 6\n");
287
288 printf("Start Test 7: fast lock and condition variable single wait/notify\n");
289 {
290 T_C_F_WS1 t1[2];
291 }
292 printf("Done Test 7\n");
293
294 printf("Start Test 8: fast lock and condition variable 3 wait/notify all\n");
295 {
296 T_C_F_WB1 t1[4];
297 }
298 printf("Done Test 8\n");
299
300 printf("Start Test 9: multi acquisiton lock and condition variable multiple acquire and wait/notify\n");
301 {
302 T_C_M_WS2 t1[2];
303 }
304 printf("Done Test 9\n");
305
306 printf("Start Test 10: owner lock and condition variable multiple acquire and wait/notify\n");
307 {
308 T_C_O_WS2 t1[2];
309 }
310 printf("Done Test 10\n");
311
312 printf("Start Test 11: no lock condition variable wait/notify\n");
313 {
314 T_C_NLW t1;
315 T_C_NLS t2;
316 }
317 printf("Done Test 11\n");
318
319 printf("Start Test 12: locked condition variable wait/notify with front()\n");
320 {
321 T_C_S_WNF t1[2];
322 }
323 printf("Done Test 12\n");
324
325 // removed to limit test duration. Full test is in long run tests
326 // printf("Start Test 11: unlocked condition variable delay wait\n");
327 // {
328 // T_C_NLWD t1;
329 // T_C_WDS t2;
330 // }
331 // printf("Done Test 11\n");
332
333 // printf("Start Test 12: locked condition variable delay wait with unlocked signal\n");
334 // {
335 // T_C_LWD t1;
336 // T_C_WDS t2;
337 // }
338 // printf("Done Test 12\n");
339
340 // printf("Start Test 13: locked condition variable delay wait with locked signal\n");
341 // {
342 // T_C_LWD t1;
343 // T_C_LWDS t2;
344 // }
345 // printf("Done Test 13\n");
346}
Note: See TracBrowser for help on using the repository browser.