source: tests/concurrent/waitfor/statment.cfa@ cca034e

ADT ast-experimental
Last change on this file since cca034e was cca568e, checked in by Peter A. Buhr <pabuhr@…>, 6 years ago

change all example waitfor statements from comma separate to colon

  • Property mode set to 100644
File size: 3.0 KB
Line 
1#include <fstream.hfa>
2#include <kernel.hfa>
3#include <monitor.hfa>
4#include <thread.hfa>
5
6#include <stdbool.h>
7
8monitor M {
9 int index;
10 int last_val;
11 int calls[7];
12};
13
14volatile bool start = false;
15
16void ?{}( M & this ) {
17 this.index = 0;
18 this.last_val = 0;
19 for( int i = 0; i < 7; i++ ) {
20 this.calls[i] = 100; //10_000;
21 }
22}
23
24void ^?{} ( M & mutex this ) {}
25
26int get_index( M & mutex this ) {
27 this.index += 1;
28 return this.index;
29}
30
31bool call1( M & mutex this ) {
32 this.last_val = 1;
33 this.calls[0] -= 1;
34 return this.calls[0] > 0;
35}
36
37bool call2( M & mutex this ) {
38 this.last_val = 2;
39 this.calls[1] -= 1;
40 return this.calls[1] > 0;
41}
42
43bool call3( M & mutex this ) {
44 this.last_val = 3;
45 this.calls[2] -= 1;
46 return this.calls[2] > 0;
47}
48
49bool call4( M & mutex this ) {
50 this.last_val = 4;
51 this.calls[3] -= 1;
52 return this.calls[3] > 0;
53}
54
55bool call5( M & mutex this ) {
56 this.last_val = 5;
57 this.calls[4] -= 1;
58 return this.calls[4] > 0;
59}
60
61bool call6( M & mutex this ) {
62 this.last_val = 6;
63 this.calls[5] -= 1;
64 return this.calls[5] > 0;
65}
66
67bool call7( M & mutex this ) {
68 this.last_val = 7;
69 this.calls[6] -= 1;
70 return this.calls[6] > 0;
71}
72
73M m;
74thread caller{};
75
76bool call( int index ) {
77 switch( index ) {
78 case 1: return call1( m );
79 case 2: return call2( m );
80 case 3: return call3( m );
81 case 4: return call4( m );
82 case 5: return call5( m );
83 case 6: return call6( m );
84 case 7: return call7( m );
85 default :
86 serr | "Incorrect index" | index;
87 abort();
88 }
89}
90
91void main( caller & this ) {
92 int index = get_index( m );
93 while( !start ) yield();
94 while( call( index ) );
95}
96
97void do_wait( M & mutex this ) {
98 bool done = false;
99
100 start = true;
101
102 while( !done ) {
103 waitfor( get_index : this );
104 or waitfor( call1 : this ) { sout | "Statement"; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val; } }
105 or waitfor( call2 : this ) { sout | "Statement"; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val; } }
106 or waitfor( call3 : this ) { sout | "Statement"; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val; } }
107 or waitfor( call4 : this ) { sout | "Statement"; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val; } }
108 or waitfor( call5 : this ) { sout | "Statement"; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val; } }
109 or waitfor( call6 : this ) { sout | "Statement"; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val; } }
110 or waitfor( call7 : this ) { sout | "Statement"; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val; } }
111
112 done = true;
113 for( int i = 0; i < 7; i++ ) {
114 if( this.calls[i] > 0 ) {
115 done = false;
116 break;
117 }
118 }
119 }
120}
121
122thread waiter{};
123
124void main( waiter & this ) {
125 do_wait( m );
126}
127
128int main() {
129 processor p[2];
130 sout | "Starting";
131 {
132 caller c[7];
133 waiter w;
134 }
135 sout | "Stopping";
136}
Note: See TracBrowser for help on using the repository browser.