source: tests/concurrency/futures/typed.cfa@ fc9d167

Last change on this file since fc9d167 was 00aa122, checked in by Peter A. Buhr <pabuhr@…>, 5 months ago

harmonize single_future with other future types, remove multi_future, marks its test as deprecated, and turn off its test

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