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); }
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); }
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()); }
private static void UnhandledIRQ(SystemIRQ irq) { Debug.Fail("Unhandled IRQ"); }
public static void RegisterSystemIRQ(SystemIRQ irq, SystemIRQHandler?handler) { Debug.Assert(irq < SystemIRQ.COUNT); Volatile.Write(ref _systemIRQHandlers[(int)irq], handler); }