public void Join(KThread targetThread, uint timeoutUs, bool canHandleCallbacks) { State = KThreadState.Waiting; this.RemoveFromSchedule(); CanHandleCallbacks = canHandleCallbacks; WaitingOn = KThreadWait.Join; if (timeoutUs > 0) { NativeMethods.QueryPerformanceCounter(out WaitTimestamp); WaitTimeout = timeoutUs * 10; // us -> ticks } else { WaitTimeout = 0; } WaitHandle = targetThread; targetThread.ExitWaiters.Enqueue(this); if (canHandleCallbacks == true) { this.Kernel.CheckCallbacks(); } this.Kernel.Schedule(); if (timeoutUs > 0) { // Install timer uint timeoutMs = Math.Max(5, timeoutUs / 1000); Kernel.AddOneShotTimer(this.JoinCallback, this, timeoutMs); } }
public void Delay(uint waitTimeUs, bool canHandleCallbacks) { State = KThreadState.Waiting; this.RemoveFromSchedule(); // A time of zero could be valid - that may mean just delay until the next time cycle //Debug.Assert( waitTimeUs > 0 ); CanHandleCallbacks = canHandleCallbacks; WaitingOn = KThreadWait.Delay; NativeMethods.QueryPerformanceCounter(out WaitTimestamp); WaitTimeout = waitTimeUs * 10; // us -> ticks // Install timer uint waitTimeMs = Math.Max(5, waitTimeUs / 1000); _waitTimer = Kernel.AddOneShotTimer(this.DelayCallback, this, waitTimeMs); if (canHandleCallbacks == true) { this.Kernel.CheckCallbacks(); } this.Kernel.Schedule(); }
private void WaitTimeoutSetup(uint timeoutUs) { if (timeoutUs > 0) { NativeMethods.QueryPerformanceCounter(out WaitTimestamp); WaitTimeout = timeoutUs * 10; // us -> ticks WaitTimeout = Math.Max(1, WaitTimeout); // Install timer uint timeoutMs = Math.Max(5, timeoutUs / 1000); Kernel.AddOneShotTimer(this.WaitCallback, this, timeoutMs); } else { WaitTimeout = 0; } }