DIRECTORY DebuggerSwap USING [CallDebugger, WorryCallDebugger, teledebug], PrincOps USING [Priority], Process USING [Detach, DisableTimeout, GetPriority, InitializeCondition, Priority, priorityClient3, prioritySwatWatcher, SetPriority], TerminalDefs USING [DownUp, KeyBits], TerminalFace USING [keyboard] ; DLionTTYSwatWatcher: MONITOR IMPORTS DebuggerSwap, Process, TerminalFace EXPORTS ~ BEGIN swatWatcherEnabled: BOOL _ FALSE; interruptWanted: BOOL; interrupter: CONDITION; CheckInterrupt: ENTRY PROC = { interruptState: TerminalDefs.DownUp _ up; keyboard: LONG POINTER TO READONLY TerminalDefs.KeyBits ~ TerminalFace.keyboard; wakeup: CONDITION; Process.InitializeCondition[@wakeup, 1]; DO --FOREVER-- ENABLE ABORTED => CONTINUE; WAIT wakeup; IF keyboard[Yellow]=down -- middle button = swat for TTY DLion -- THEN { IF interruptState=up THEN { interruptState _ down; DebuggerSwap.teledebug _ TRUE; IF keyboard[Red]=down -- left button = shift for TTY DLion -- THEN DebuggerSwap.WorryCallDebugger["Keyboard interrupt (worry mode)"L] ELSE { interruptWanted _ TRUE; NOTIFY interrupter }; }; } ELSE interruptState _ up; ENDLOOP; }; InterruptSpawner: PROC = { WaitUntilWanted: ENTRY PROC = { ENABLE UNWIND => NULL; interruptWanted _ FALSE; UNTIL interruptWanted DO WAIT interrupter ENDLOOP; }; DO ENABLE ABORTED => CONTINUE; WaitUntilWanted[]; Process.Detach[FORK Interrupt[]]; ENDLOOP; }; Interrupt: PROC = { DebuggerSwap.CallDebugger["Keyboard interrupt"L]; }; swatWatcherStarted: BOOL _ FALSE; StartSwatWatcher: PUBLIC ENTRY SAFE PROC[enabled: BOOL] = TRUSTED { IF NOT swatWatcherStarted THEN { priorityPrev: PrincOps.Priority = Process.GetPriority[]; Process.InitializeCondition[@interrupter, 0]; Process.DisableTimeout[@interrupter]; Process.SetPriority[Process.priorityClient3]; Process.Detach[FORK InterruptSpawner[]]; Process.SetPriority[Process.prioritySwatWatcher]; Process.Detach[FORK CheckInterrupt[]]; Process.SetPriority[priorityPrev]; swatWatcherStarted _ TRUE; }; swatWatcherEnabled _ enabled; }; EnableSwatWatcher: PUBLIC ENTRY SAFE PROCEDURE[enabled: BOOL] = CHECKED{ swatWatcherEnabled _ enabled }; Initialize: PUBLIC PROC = BEGIN swatWatcherStarted _ FALSE; swatWatcherEnabled _ FALSE; StartSwatWatcher[TRUE]; END; Initialize[]; END. ΤDLionTTYSwatWatcher.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Tim Diebert: December 19, 1985 4:29:47 pm PST Must not be invoked until KeyboardFace and Process have been initialized. Κ”˜™Icodešœ Οmœ1™