source: CIVL/examples/concurrency/barrier2.cvl@ 9705dfd

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 9705dfd was 72c01cc, checked in by Stephen Siegel <siegel@…>, 13 years ago

Continuing to clean up examples, but just realized the minimal
depth search is not quite right, it won't necessarily find
the minimum, as revealed by dining philosophers.

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

  • Property mode set to 100644
File size: 1.5 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 $when (barrier->lock==0) barrier->lock = 1;
36 barrier->in_barrier[tid] = 1;
37 barrier->num_in_barrier++;
38 if (barrier->num_in_barrier == barrier->numProcs) {
39 for (int i=0; i<barrier->numProcs; i++)
40 barrier->in_barrier[i] = 0;
41 barrier->num_in_barrier = 0;
42 }
43 barrier->lock = 0;
44 $when (barrier->in_barrier[tid] == 0);
45}
46
47
48void main() {
49 int N=4;
50 $proc threads[N];
51 int counter = 0;
52 CIVL_Barrier b;
53 int barrier_array[N];
54
55 void run(int tid) {
56 while ($true) {
57 $assert counter == 0;
58 CIVL_barrier(&b, tid);
59 counter++;
60 CIVL_barrier(&b, tid);
61 $assert counter == N;
62 CIVL_barrier(&b, tid);
63 counter--;
64 CIVL_barrier(&b, tid);
65 }
66 }
67
68 CIVL_Barrier_init(N, &b, barrier_array);
69 for (int i=0; i<N; i++) threads[i] = $spawn run(i);
70 for (int i=0; i<N; i++) $wait threads[i];
71}
Note: See TracBrowser for help on using the repository browser.