Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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;
            }
        }