Пример #1
0
        private static ThreadContext OnCoreNotification(SystemIRQ irq, ThreadContext context)
        {
            while (_dpcs.Count != 0)
            {
                var item = _dpcs.First;
                _dpcs.RemoveFirst();

                context = item !.Value.Callback(item.Value.Argument, context);
            }

            return(context);
        }
Пример #2
0
        internal static void DispatchSystemIRQ(SystemIRQ irq, ThreadContext context)
        {
            Debug.Assert(irq < SystemIRQ.COUNT);
            var handler = Volatile.Read(ref _systemIRQHandlers[(int)irq]);

            if (handler != null)
            {
                context = handler(irq, context);
            }
            else
            {
                UnhandledIRQ(irq);
            }

            ExitIRQHandler(context);
        }
Пример #3
0
        private ThreadContext OnSystemTick(SystemIRQ irq, ThreadContext context)
        {
            TickCount++;

            // Unblock delayed threads
            while (true)
            {
                var first = _delayedThreads.First;
                if (first != null && TickCount >= first.Value.AwakeTick)
                {
                    _delayedThreads.Remove(first);
                    _readyThreads.AddLast(first);
                    first.Value.Thread.State = ThreadState.Ready;
                }
                else
                {
                    break;
                }
            }

            return(YieldThread());
        }
Пример #4
0
 private static void UnhandledIRQ(SystemIRQ irq)
 {
     Debug.Fail("Unhandled IRQ");
 }
Пример #5
0
 public static void RegisterSystemIRQ(SystemIRQ irq, SystemIRQHandler?handler)
 {
     Debug.Assert(irq < SystemIRQ.COUNT);
     Volatile.Write(ref _systemIRQHandlers[(int)irq], handler);
 }