source: tests/concurrency/unified_locking/locks.cfa@ 6cb3e5d

Last change on this file since 6cb3e5d was 6cb3e5d, checked in by Peter A. Buhr <pabuhr@…>, 6 months ago

formatting. reduce experiment duration

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