public long Start() { long Result = MakeError(ErrorModule.Kernel, KernelErr.ThreadTerminating); System.CriticalSectionLock.Lock(); if (!ShallBeTerminated) { KThread CurrentThread = System.Scheduler.GetCurrentThread(); while (SchedFlags != ThreadSchedState.TerminationPending && CurrentThread.SchedFlags != ThreadSchedState.TerminationPending && !CurrentThread.ShallBeTerminated) { if ((SchedFlags & ThreadSchedState.LowNibbleMask) != ThreadSchedState.None) { Result = MakeError(ErrorModule.Kernel, KernelErr.InvalidState); break; } if (CurrentThread.ForcePauseFlags == ThreadSchedState.None) { if (Owner != null && ForcePauseFlags != ThreadSchedState.None) { CombineForcePauseFlags(); } SetNewSchedFlags(ThreadSchedState.Running); Result = 0; break; } else { CurrentThread.CombineForcePauseFlags(); System.CriticalSectionLock.Unlock(); System.CriticalSectionLock.Lock(); if (CurrentThread.ShallBeTerminated) { break; } } } } System.CriticalSectionLock.Unlock(); return(Result); }
public KernelResult Start() { if (!System.KernelInitialized) { System.CriticalSection.Enter(); if (!ShallBeTerminated && SchedFlags != ThreadSchedState.TerminationPending) { _forcePauseFlags |= ThreadSchedState.KernelInitPauseFlag; CombineForcePauseFlags(); } System.CriticalSection.Leave(); } KernelResult result = KernelResult.ThreadTerminating; System.CriticalSection.Enter(); if (!ShallBeTerminated) { KThread currentThread = System.Scheduler.GetCurrentThread(); while (SchedFlags != ThreadSchedState.TerminationPending && currentThread.SchedFlags != ThreadSchedState.TerminationPending && !currentThread.ShallBeTerminated) { if ((SchedFlags & ThreadSchedState.LowMask) != ThreadSchedState.None) { result = KernelResult.InvalidState; break; } if (currentThread._forcePauseFlags == ThreadSchedState.None) { if (Owner != null && _forcePauseFlags != ThreadSchedState.None) { CombineForcePauseFlags(); } SetNewSchedFlags(ThreadSchedState.Running); result = KernelResult.Success; break; } else { currentThread.CombineForcePauseFlags(); System.CriticalSection.Leave(); System.CriticalSection.Enter(); if (currentThread.ShallBeTerminated) { break; } } } } System.CriticalSection.Leave(); return(result); }