source: CIVL/mods/dev.civl.abc/examples/alias/barrier.cvl

main
Last change on this file was aad342c, checked in by Stephen Siegel <siegel@…>, 3 years ago

Performing huge refactor to incorporate ABC, GMC, and SARL into CIVL repo and use Java modules.

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

  • Property mode set to 100644
File size: 1.5 KB
Line 
1#include<civlc.cvh>
2
3$input int N=2;
4
5typedef struct gbarrier{
6 int nprocs;
7 int num_in_barrier;
8 _Bool in_barrier[N];
9}* gbarrier_t;
10
11typedef struct barrier{
12 gbarrier_t gbarrier;
13 int id;
14}* barrier_t;
15
16gbarrier_t gbarrierA=(gbarrier_t)$malloc($here, sizeof(struct gbarrier)),
17 gbarrierB=(gbarrier_t)$malloc($here, sizeof(struct gbarrier));
18
19void initialize(gbarrier_t gbarrier){
20 gbarrier->nprocs=N;
21 for(int i=0; i<N; i++)
22 gbarrier->in_barrier[i]=$false;
23 gbarrier->num_in_barrier=0;
24}
25
26void barrier_call(barrier_t barrier){
27 gbarrier_t gbarrier=barrier->gbarrier;
28 int num=gbarrier->nprocs;
29
30 $atomic{
31 gbarrier->in_barrier[barrier->id]=$true;
32 gbarrier->num_in_barrier++;
33 }
34 $when(gbarrier->num_in_barrier==num);
35 $atomic{
36 gbarrier->in_barrier[barrier->id]=$false;
37 if($forall{int i | 0 <= i && i<num}(!gbarrier->in_barrier[i]))
38 gbarrier->num_in_barrier=0;
39 }
40}
41
42void thread(int tid, gbarrier_t mygbarrier){
43 barrier_t barrier=(barrier_t)$malloc($here, sizeof(struct barrier));
44
45 barrier->gbarrier=mygbarrier;
46 barrier->id=tid;
47 barrier_call(barrier);
48 $free(barrier);
49}
50
51int main(void){
52 initialize(gbarrierA);
53 initialize(gbarrierB);
54 $atomic{
55 $proc grpA[N], grpB[N];
56
57 //two groups of threads are accessing two different gbarrier objects
58 $for(int i: 0 .. N-1)
59 grpA[i] = $spawn thread(i, gbarrierA);
60 $for(int i: 0 .. N-1)
61 grpB[i] = $spawn thread(i, gbarrierB);
62 $waitall(grpA, N);
63 $waitall(grpB, N);
64 }
65 $free(gbarrierA);
66 $free(gbarrierB);
67}
Note: See TracBrowser for help on using the repository browser.