source: tests/concurrency/waitfor/statment.cfa @ 65ef0cd

Last change on this file since 65ef0cd was c26bea2a, checked in by Peter A. Buhr <pabuhr@…>, 18 months ago

first attempt at renaming directory tests/concurrent to tests/concurrency to harmonize with other concurrency directory names

  • 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.