source: CIVL/examples/barrier2.cvl@ 9179b4f

1.23 2.0 main test-branch
Last change on this file since 9179b4f was bf5d35f, checked in by Stephen Siegel <siegel@…>, 13 years ago

Adding new examples. Removed unused definition in build.xml.

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

  • Property mode set to 100644
File size: 1.3 KB
Line 
1// attempt to make general barrier module
2#include <civlc.h>
3
4typedef struct _CIVL_Barrier {
5 int numProcs;
6 int *in_barrier;
7 int num_in_barrier;
8 int lock;
9} CIVL_Barrier;
10
11void CIVL_Barrier_init(int numProcs, CIVL_Barrier *barrier, int *array) {
12 barrier->numProcs = numProcs;
13 barrier->num_in_barrier = 0;
14 barrier->lock = 0;
15 barrier->in_barrier = array;
16 for (int i=0; i<numProcs; i++)
17 barrier->in_barrier[i] = 0;
18 return barrier;
19}
20
21void CIVL_barrier(CIVL_Barrier *barrier, int tid) {
22 $when (barrier->lock==0) barrier->lock = 1;
23 barrier->in_barrier[tid] = 1;
24 barrier->num_in_barrier++;
25 if (barrier->num_in_barrier == barrier->numProcs) {
26 for (int i=0; i<barrier->numProcs; i++)
27 barrier->in_barrier[i] = 0;
28 barrier->num_in_barrier = 0;
29 }
30 barrier->lock = 0;
31 $when (barrier->in_barrier[tid] == 0);
32}
33
34
35void main() {
36 int N=4;
37 $proc threads[N];
38 int counter = 0;
39 CIVL_Barrier b;
40 int barrier_array[N];
41
42 void run(int tid) {
43 while ($true) {
44 $assert counter == 0;
45 CIVL_barrier(&b, tid);
46 counter++;
47 CIVL_barrier(&b, tid);
48 $assert counter == N;
49 CIVL_barrier(&b, tid);
50 counter--;
51 CIVL_barrier(&b, tid);
52 }
53 }
54
55 CIVL_Barrier_init(N, &b, barrier_array);
56 for (int i=0; i<N; i++) threads[i] = $spawn run(i);
57 for (int i=0; i<N; i++) $wait threads[i];
58}
Note: See TracBrowser for help on using the repository browser.