source: CIVL/examples/verifyThisProblems/barrier2.cvl@ 22b4ef04

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 22b4ef04 was 22b4ef04, checked in by Manchun Zheng <zmanchun@…>, 10 years ago

added examples from VerifyThis competition 2016

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

  • Property mode set to 100644
File size: 3.6 KB
Line 
1/* Barrier solution.
2 * Got (1) but not (2).
3 */
4#include <civlc.cvh>
5#include <stdlib.h>
6#include <stdbool.h>
7#include <stdio.h>
8
9// the number of nodes... (tried with N=1,2,3)
10$input int N = 3; // N=4 took 115 seconds
11
12typedef struct _node {
13 $proc p;
14 struct _node *left, *right;
15 struct _node *parent;
16 _Bool sense;
17 int version;
18} *Node;
19
20Node theNodes[N];
21int count = 0;
22
23// check all sensens in u and descendants are true...
24void checkSensesTrue(Node u) {
25 if (u != NULL) {
26 $assert(u->sense);
27 checkSensesTrue(u->left);
28 checkSensesTrue(u->right);
29 }
30}
31
32// the function a thread runs...
33void thread(Node myNode) {
34
35 // the barrier function
36 void barrier() {
37 $assert(!myNode->sense);
38
39 // synchronization phase
40 if (myNode->left != NULL)
41 $when (myNode->left->sense);
42 if (myNode->right != NULL)
43 $when (myNode->right->sense);
44
45 $atomic {
46 myNode->sense = true;
47 checkSensesTrue(myNode);
48 myNode->version++;
49 if (myNode->parent == NULL) {
50 for (int i=0; i<N; i++)
51 $assert(theNodes[i]->version == myNode->version);
52 }
53 }
54
55
56 // wake-up phase
57 if (myNode->parent == NULL) {
58 myNode->sense = false;
59 }
60
61 $when (!myNode->sense);
62 if (myNode->left != NULL)
63 myNode->left->sense = false;
64 if (myNode->right != NULL)
65 myNode->right->sense = false;
66
67 $assert(!myNode->sense);
68 }
69
70 //myNode->p = $self;
71 // run around barrier 3 times...
72 for (int i=0; i<3; i++) {
73 barrier();
74 }
75}
76
77
78Node makeTree(Node left, Node right) {
79 Node result = (Node)malloc(sizeof(struct _node));
80
81 result->left = left;
82 result->right = right;
83 result->sense = false;
84 result->version = 0;
85 if (left != NULL)
86 left->parent = result;
87 if (right != NULL)
88 right->parent = result;
89 result->parent = NULL;
90 return result;
91}
92
93
94// create an arbitrary tree with numNodes nodes...
95Node makeArbitraryTree(int numNodes) {
96 printf("Entering makeArbitraryTree: numNodes = %d\n", numNodes);
97 if (numNodes == 0)
98 return NULL;
99
100 // how many nodes in left sub-tree?
101 // nondeterministically choose integer in range 0..numNodes-1.
102 // total number of nodes = leftSize + rightSize + 1
103
104 int leftSize = $choose_int(numNodes);
105
106 printf("leftSize = %d\n", leftSize);
107 $assert(leftSize >= 0);
108 $assert(leftSize < numNodes);
109
110 int rightSize = numNodes - (leftSize + 1);
111
112 printf("rightSize = %d\n", rightSize);
113 printf("numNodes = %d\n", numNodes);
114 printf("\n");
115
116 Node leftTree = makeArbitraryTree(leftSize);
117 Node rightTree = makeArbitraryTree(numNodes - leftSize - 1);
118 Node result = makeTree(leftTree, rightTree);
119
120 theNodes[count] = result;
121 count++;
122 return result;
123}
124
125// compute number of nodes in tree...
126int sizeOfTree(Node tree) {
127 if (tree == NULL)
128 return 0;
129
130 int result = 1 + sizeOfTree(tree->left) + sizeOfTree(tree->right);
131
132 return result;
133}
134
135// free all nodes in the tree...
136void freeTree(Node tree) {
137 if (tree != NULL) {
138 freeTree(tree->left);
139 freeTree(tree->right);
140 free(tree);
141 }
142}
143
144
145int main() {
146 Node theTree = makeArbitraryTree(N);
147
148 $atomic {
149 // sanity check...
150 $assert(sizeOfTree(theTree) == N);
151 $assert(count == N);
152 for (int i=0; i<N; i++)
153 $assert(theNodes[i] != NULL);
154 for (int i=0; i<N; i++) {
155 $proc p = $spawn thread(theNodes[i]);
156
157 theNodes[i]->p = p;
158 }
159 }
160 // now the procs are running, wait for them all to terminate...
161 for (int i=0; i<N; i++)
162 $wait(theNodes[i]->p);
163 freeTree(theTree);
164}
Note: See TracBrowser for help on using the repository browser.