<> <> <> DIRECTORY AMEvents USING[ EventProc ], AMTypes USING [ TV ], DebuggerFormat USING [ DebugParameter, ExternalStateVector, SwapInfo ], PrincOps USING[ StateVector ], WorldVM USING[ Address, World ]; AMEventsBackdoorExtra: DEFINITIONS = BEGIN World: TYPE = WorldVM.World; Address: TYPE = WorldVM.Address; DebugParameter: TYPE = DebuggerFormat.DebugParameter; EventProc: TYPE = AMEvents.EventProc; StateVector: TYPE = PrincOps.StateVector; ExternalStateVector: TYPE = DebuggerFormat.ExternalStateVector; TV: TYPE = AMTypes.TV; <<>> <> Actor: TYPE = REF ActorObject; ActorObject: TYPE = RECORD[ <> next: Actor, world: World, data: REF, -- data to be passed back to the event proc proc: EventProc, -- event notification handler users: INT _ 1, -- reference count on GetEvents/StopEvents <> running: BOOL _ TRUE, -- client is running listener: PROCESS _ NIL, -- if not NIL, the process looking at the client bootCount: INT _ 0, -- incremented when a client session ends level: CARDINAL _ 0, -- nesting level of client procedure calls <> swapInfo: DebuggerFormat.SwapInfo _ NULL, esvAddr: Address _ 0, esv: ExternalStateVector _ NULL, paramAddr: Address _ 0, param: DebugParameter _ NULL, stateAddr: Address _ 0, state: StateVector _ NULL ]; <<>> <> <> <> <<>> <> <<"a.level" is altered with the monitor and a.running claimed, so it may be read either inside the monitor or by claiming a.running.>> <> <<* ensuring that only one process transfers control to the client at a time>> <<* the client booting>> <<* someone calling "StopEvents">> <> <> <> <> <> KillThisTurkey: ERROR; NotImplemented: ERROR; BreakNotFound: ERROR; <> SupressUncaughtAborted: BOOL; <> CrashOnRecursiveAppearance: BOOL; <> Informing: BOOL; <> Wsls: BOOL; <> Actors: Actor ; -- the list of event watchers LocalActor: Actor ; PSBIToTV: PROC [psbi: CARDINAL, world: World] RETURNS [p: TV]; END. <<>> <<>> <> <> <<>> <<>> <<>> <<>> <<>> <<>>