source: tests/concurrency/futures/abandon.cfa @ 06ecda9

Last change on this file since 06ecda9 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: 1.5 KB
Line 
1#include <thread.hfa>
2
3enum {NFUTURES = 10};
4
5thread Server {
6        int cnt;
7        future_t * requests[NFUTURES];
8};
9
10void ?{}( Server & this ) {
11        this.cnt = 0;
12        for(i; NFUTURES) {
13                this.requests[i] = 0p;
14        }
15}
16
17void ^?{}( Server & mutex this ) {
18        assert(this.cnt == 0);
19        for(i; NFUTURES) {
20                this.requests[i] = 0p;
21        }
22}
23
24void process( Server & this, int i ) {
25        if( this.requests[i] == 0p ) return;
26        future_t * f = this.requests[i];
27        this.requests[i] = 0p;
28        this.cnt--;
29        fulfil( *f );
30}
31
32void call( Server & mutex this, future_t & f ) {
33        for(i; NFUTURES) {
34                if( this.requests[i] == 0p ) {
35                        this.requests[i] = &f;
36                        this.cnt++;
37                        return;
38                }
39        }
40        abort("Monitor Error");
41}
42
43void main( Server & this ) {
44        unsigned i = 0;
45        for() {
46                waitfor( ^?{} : this ) {
47                        break;
48                }
49                or when( this.cnt < NFUTURES ) waitfor( call: this ) {}
50                or else {
51                        process( this, i % NFUTURES );
52                        i++;
53                }
54        }
55
56        for(i; NFUTURES) {
57                process( this, i );
58        }
59}
60
61Server * the_server;
62thread Worker {};
63
64void thrash(void) {
65        volatile int locals[250];
66        for(i; 250) {
67                locals[i] = 0xdeadbeef;
68        }
69}
70
71void work(int i) {
72        future_t *mine = new();
73        call( *the_server, *mine );
74        if (i % 2 == 0) {
75                abandon( *mine );
76        } else {
77                wait( *mine );
78                delete( mine );
79        }
80}
81
82void main( Worker & ) {
83        for(i;150) {
84                thrash();
85                work(i);
86                thrash();
87        }
88}
89
90int main() {
91        printf( "start\n" );                            // non-empty .expect file
92        processor procs[2];
93        {
94                Server server;
95                the_server = &server;
96                {
97                        Worker workers[17];
98                }
99        }
100        printf( "done\n" );                             // non-empty .expect file
101
102}
Note: See TracBrowser for help on using the repository browser.