示例#1
0
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();
        }
}
示例#2
0
void Writer( void * arg )
{
	struct LOCKING_CONTEXT block;
	INDEX sequenceIndex=0;
	INDEX index;

	LockingInit( &block, LockingBlockNonBlocking, LockingWakeNonBlocking );

	while(1)
	{
		ResourceLockExclusive( &BufferLock, &block);

		while( !LockingIsAcquired( &block ) );
	
		//resource should be exlusive
		ASSERT( BufferLock.State == RESOURCE_EXCLUSIVE );

		sequenceIndex++;
		sequenceIndex%=SEQUENCE_LENGTH;

		for( index = 0; index < BUFFER_SIZE; index++ )
		{
			Buffer[index] = index + Sequence[ sequenceIndex ] ;
		}
		
		ResourceUnlockExclusive( &BufferLock );
		
		SchedulerStartCritical();
		TimesWritten++;
		SchedulerForceSwitch();
	}
}
示例#3
0
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();
	}
}
示例#4
0
void StallThreadMain( void * arg )
{
	while(TRUE)
	{
		if(StallCount != 0 )
		{
			KernelPanic();
		}

		StallCount++;
		TotalStall++;
		SchedulerStartCritical();
		SchedulerBlockThread();
		SchedulerForceSwitch();
	}

	//We should never get here.
	KernelPanic();
}