void RestartThreadMain( void * arg ) { while(TRUE) { SchedulerStartCritical(); if( SchedulerIsThreadDead( &DeathThread ) ) { SchedulerCreateThread( &DeathThread, 1, DeathThreadStack, STACK_SIZE, DeathThreadMain, NULL, TRUE); DeathCount--; } if( SchedulerIsThreadBlocked( &StallThread ) ) { SchedulerResumeThread( &StallThread ); StallCount--; } SchedulerEndCritical(); } }
void Reader( void * arg ) { INDEX index; int first,second; BOOL ready = FALSE; while( ! ready ) { SchedulerStartCritical(); if( TimesWritten > 0 ) { ready = TRUE; SchedulerEndCritical(); } else { SchedulerForceSwitch(); } } while(1) { ResourceLockShared( &BufferLock, NULL ); //the resource should be shared ASSERT( BufferLock.State == RESOURCE_SHARED ); for(index=1 ; index < BUFFER_SIZE; index++) { first = Buffer[index-1]; second = Buffer[index]; if( (first +1) != second ) { KernelPanic( ); } } ResourceUnlockShared( &BufferLock ); SchedulerStartCritical(); TimesRead++; SchedulerForceSwitch(); } }