#include #include enum {NFUTURES = 10}; thread Server { int cnt; single_future(int) * requests[NFUTURES]; }; void ?{}( Server & server ) with( server ) { cnt = 0; for ( i; NFUTURES ) { requests[i] = 0p; } } void ^?{}( Server & mutex server ) with( server ) { assert( cnt == 0 ); for ( i; NFUTURES ) { requests[i] = 0p; } } void process( Server & server, int i ) with( server ) { if ( requests[i] == 0p ) return; single_future(int) * f = requests[i]; requests[i] = 0p; cnt--; (*f)( i ); // fulfil } void call( Server & mutex server, single_future(int) & f ) with( server ) { for ( i; NFUTURES ) { if ( requests[i] == 0p ) { requests[i] = &f; cnt++; return; } } abort("Monitor Error"); } void main( Server & server ) { unsigned i = 0; for () { waitfor ( ^?{} : server ) { break; } or when( server.cnt < NFUTURES ) waitfor( call : server ) {} or else { process( server, i % NFUTURES ); i++; } } for ( i; NFUTURES ) { process( server, i ); } } Server * the_server; thread Worker {}; void thrash() { volatile int locals[250]; for ( i; 250 ) { locals[i] = 0xdeadbeef; } } void work() { single_future(int) mine; call( *the_server, mine ); mine(); // get } void main( Worker & ) { for ( 150 ) { thrash(); work(); thrash(); } } int main() { printf( "start\n" ); // non-empty .expect file processor procs[2]; { Server server; the_server = &server; { Worker workers[17]; } } printf( "done\n" ); // non-empty .expect file }