//---------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------- // // DEPRECATED TEST // //---------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------- #include #include #include #include #include static const unsigned long N = 50_000ul; #ifndef PREEMPTION_RATE #define PREEMPTION_RATE 10_000ul #endif unsigned int default_preemption() { return 0; } enum state_t { WAIT, SIGNAL, BARGE }; monitor global_t {}; monitor global_data_t { volatile bool done; int counter; state_t state; unsigned short do_signal; unsigned short do_wait2; unsigned short do_wait1; }; void ?{} ( global_data_t & this ) { this.done = false; this.counter = 0; this.state = BARGE; this.do_signal = 6; this.do_wait1 = 1; this.do_wait2 = 3; } void ^?{} ( global_data_t & this ) {} global_t globalA; global_t globalB; global_data_t globalC; condition cond; thread Threads {}; bool logicC( global_t & mutex a, global_t & mutex b, global_data_t & mutex c ) { c.counter++; if( (c.counter % 1000) == 0 ) sout | c.counter | endl; int action = c.counter % 10; if( action == 0 ) { c.do_signal = max( ((unsigned)rand48()) % 10, 1); c.do_wait1 = ((unsigned)rand48()) % (c.do_signal); c.do_wait2 = ((unsigned)rand48()) % (c.do_signal); if(c.do_wait1 == c.do_wait2) sout | "Same" | endl; } if( action == c.do_wait1 || action == c.do_wait2 ) { c.state = WAIT; wait( &cond ); if(c.state != SIGNAL) { sout | "ERROR Barging detected" | c.counter | endl; abort(); } } else if( action == c.do_signal ) { c.state = SIGNAL; signal( &cond ); signal( &cond ); } else { c.state = BARGE; } if( c.counter >= N ) c.done = true; return !c.done; } bool logicB( global_t & mutex a, global_t & mutex b ) { return logicC(a, b, globalC); } bool logicA( global_t & mutex a ) { return logicB(a, globalB); } void main( Threads & this ) { while( logicA(globalA) ) { yield(); }; } static thread_desc * volatile the_threads; int main(int argc, char* argv[]) { rand48seed(0); processor p; { Threads t[17]; the_threads = (thread_desc*)t; } }