Changeset a933dcf4
- 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
- Location:
- src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/monitor.c
r5783e94 ra933dcf4 16 16 17 17 #include "monitor" 18 19 #include <stdlib> 18 20 19 21 #include "kernel_private.h" … … 351 353 LIB_DEBUG_PRINT_SAFE("Branding\n"); 352 354 assertf( thrd->current_monitors != NULL, "No current monitor to brand condition", thrd->current_monitors ); 353 this->monitors = thrd->current_monitors;354 355 this->monitor_count = thrd->current_monitor_count; 356 357 this->monitors = malloc( this->monitor_count * sizeof( *this->monitors ) ); 358 for( int i = 0; i < this->monitor_count; i++ ) { 359 this->monitors[i] = thrd->current_monitors[i]; 360 } 355 361 } 356 362 } -
src/tests/.expect/concurrent/sched-int-multi.txt
r5783e94 ra933dcf4 1 Waiting All 2 Entering A 3 Entering A & B 4 Signal 5 Leaving A & B 6 Leaving A 7 Done waiting 1 1000 2 2000 3 3000 4 4000 5 5000 6 6000 7 7000 8 8000 9 9000 10 10000 11 11000 12 12000 13 13000 14 14000 15 15000 16 16000 17 17000 18 18000 19 19000 20 20000 21 21000 22 22000 23 23000 24 24000 25 25000 26 26000 27 27000 28 28000 29 29000 30 30000 31 31000 32 32000 33 33000 34 34000 35 35000 36 36000 37 37000 38 38000 39 39000 40 40000 41 41000 42 42000 43 43000 44 44000 45 45000 46 46000 47 47000 48 48000 49 49000 50 50000 51 51000 52 52000 53 53000 54 54000 55 55000 56 56000 57 57000 58 58000 59 59000 60 60000 61 61000 62 62000 63 63000 64 64000 65 65000 66 66000 67 67000 68 68000 69 69000 70 70000 71 71000 72 72000 73 73000 74 74000 75 75000 76 76000 77 77000 78 78000 79 79000 80 80000 81 81000 82 82000 83 83000 84 84000 85 85000 86 86000 87 87000 88 88000 89 89000 90 90000 91 91000 92 92000 93 93000 94 94000 95 95000 96 96000 97 97000 98 98000 99 99000 100 100000 -
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.