source: CIVL/examples/concurrency/barrier2.cvl@ 4f22a92

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 4f22a92 was 8b354468, checked in by Manchun Zheng <zmanchun@…>, 12 years ago

fix indention of atomic block

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@402 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 1.6 KB
Line 
1/* Basic flag barrier. Same algorithm as barrier.cvl, but
2 * packaged to be re-used in other code.
3 */
4#include <civlc.h>
5
6struct _CIVL_Barrier {
7 int numProcs;
8 int *in_barrier;
9 int num_in_barrier;
10 int lock;
11};
12
13/*
14typedef struct _CIVL_Barrier {
15 int numProcs;
16 int *in_barrier;
17 int num_in_barrier;
18 int lock;
19} CIVL_Barrier;
20*/
21
22typedef struct _CIVL_Barrier CIVL_Barrier;
23
24void CIVL_Barrier_init(int numProcs, CIVL_Barrier *barrier, int *array) {
25 barrier->numProcs = numProcs;
26 barrier->num_in_barrier = 0;
27 barrier->lock = 0;
28 barrier->in_barrier = array;
29 for (int i=0; i<numProcs; i++)
30 barrier->in_barrier[i] = 0;
31 return barrier;
32}
33
34void CIVL_barrier(CIVL_Barrier *barrier, int tid) {
35 $atomic {
36 $when (barrier->lock==0) barrier->lock = 1;
37 barrier->in_barrier[tid] = 1;
38 barrier->num_in_barrier++;
39 if (barrier->num_in_barrier == barrier->numProcs) {
40 for (int i=0; i<barrier->numProcs; i++)
41 barrier->in_barrier[i] = 0;
42 barrier->num_in_barrier = 0;
43 }
44 barrier->lock = 0;
45 $when (barrier->in_barrier[tid] == 0);
46 }
47}
48
49
50void main() {
51 int N=4;
52 $proc threads[N];
53 int counter = 0;
54 CIVL_Barrier b;
55 int barrier_array[N];
56
57 void run(int tid) {
58 while ($true) {
59 $assert counter == 0;
60 CIVL_barrier(&b, tid);
61 counter++;
62 CIVL_barrier(&b, tid);
63 $assert counter == N;
64 CIVL_barrier(&b, tid);
65 counter--;
66 CIVL_barrier(&b, tid);
67 }
68 }
69
70 $atomic {
71 CIVL_Barrier_init(N, &b, barrier_array);
72 for (int i=0; i<N; i++) threads[i] = $spawn run(i);
73 }
74 $atomic {
75 for (int i=0; i<N; i++) $wait threads[i];
76 }
77}
Note: See TracBrowser for help on using the repository browser.