source: CIVL/examples/concurrency/barrier2.cvl@ 2b5dc93

1.23 2.0 main test-branch
Last change on this file since 2b5dc93 was 793cfc2, checked in by Tim Zirkel <zirkeltk@…>, 13 years ago

Reorganized examples and tests. Added algebra, assoc, dining, assume, and scoping examples.

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

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