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.ExceptionalSchedFlags == ThreadSchedState.None) { if (Owner != null && ExceptionalSchedFlags != ThreadSchedState.None) { CombineExceptionalSchedFlags(); } SetNewSchedFlags(ThreadSchedState.Running); Result = 0; break; } else { CurrentThread.CombineExceptionalSchedFlags(); System.CriticalSectionLock.Unlock(); System.CriticalSectionLock.Lock(); if (CurrentThread.ShallBeTerminated) { break; } } } } System.CriticalSectionLock.Unlock(); return(Result); }