Changeset a933dcf4 for src/tests/sched-int-multi.c
- Timestamp:
- May 2, 2017, 2:42:14 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- b510ac2
- Parents:
- 5783e94
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/tests/sched-int-multi.c
r5783e94 ra933dcf4 4 4 #include <thread> 5 5 6 enum state_t { WAIT, SIGNAL, BARGE }; 7 6 8 monitor global_t {}; 7 9 10 monitor global_data_t { 11 bool done; 12 int counter; 13 state_t state; 14 }; 15 16 void ?{} ( global_data_t * this ) { 17 this->done = false; 18 this->counter = 0; 19 this->state = BARGE; 20 } 21 22 void ^?{} ( global_data_t * this ) {} 23 24 global_t globalA; 8 25 global_t globalB; 9 global_ t globalA;26 global_data_t globalC; 10 27 11 28 condition cond; 12 29 13 thread Signalee {}; 14 thread Signaler {}; 30 thread Threads {}; 15 31 16 void signalee_action( global_t * mutex a, global_t * mutex b ) { 17 sout | "Waiting All" | endl; 18 wait( &cond ); 19 sout | "Done waiting" | endl; 32 bool logicC( global_t * mutex a, global_t * mutex b, global_data_t * mutex c ) { 33 c->counter++; 34 35 int action = c->counter % 10; 36 37 if( action == 1 || action == 3 ) { 38 if(c->state != BARGE) { 39 sout | "ERROR Mutual exclusion is inconsistent for wait" | endl; 40 abort(); 41 } 42 43 c->state = WAIT; 44 wait( &cond ); 45 46 if(c->state != SIGNAL) { 47 sout | "ERROR Barging detected" | endl; 48 abort(); 49 } 50 } 51 else if( action == 6 ) { 52 if(c->state != BARGE) { 53 sout | "ERROR Mutual exclusion is inconsistent for signal" | endl; 54 abort(); 55 } 56 57 c->state = SIGNAL; 58 59 signal( &cond ); 60 signal( &cond ); 61 } 62 else { 63 c->state = BARGE; 64 } 65 66 if( (c->counter % 1000) == 0 ) sout | c->counter | endl; 67 if( c->counter == 100_000 ) c->done = true; 68 return !c->done; 20 69 } 21 70 22 void main( Signalee* this) {23 signalee_action( &globalA, &globalB);71 bool logicB( global_t * mutex a, global_t * mutex b ) { 72 return logicC(a, b, &globalC); 24 73 } 25 74 26 void signaler_action_inner( global_t * mutex a, global_t * mutex b ) { 27 sout | "Entering A & B" | endl; 28 sout | "Signal" | endl; 29 signal( &cond ); 30 sout | "Leaving A & B" | endl; 75 bool logicA( global_t * mutex a ) { 76 return logicB(a, &globalB); 31 77 } 32 78 33 void signaler_action( global_t * mutex a, global_t * b ) { 34 sout | "Entering A" | endl; 35 signaler_action_inner( a, b ); 36 sout | "Leaving A" | endl; 37 } 38 39 void main( Signaler* this ) { 40 for(int i = 0; i < 10_000; i++) { 41 asm volatile ("" : : : "memory"); 42 } 43 44 signaler_action( &globalA, &globalB ); 79 void main( Threads* this ) { 80 while( logicA(&globalA) ) { yield(); }; 45 81 } 46 82 47 83 int main(int argc, char* argv[]) { 48 processor p ;84 processor p[3]; 49 85 { 50 Signalee a; 51 Signaler b; 86 Threads t[20]; 52 87 } 53 88 }
Note: See TracChangeset
for help on using the changeset viewer.