<> <> DIRECTORY BasicTime USING [Pulses], FastBreak USING [FastBreakProc], IO USING [STREAM], PrincOps USING [BytePC, FrameHandle, GFT, GFTIndex, GlobalFrameHandle, PsbIndex], Process USING [GetCurrent, Priority], Rope USING [ROPE], SpyClient USING [DataType, StackType]; SpyOps: DEFINITIONS IMPORTS Process = BEGIN ROPE: TYPE = Rope.ROPE; <<**********************************************************>> <> <<**********************************************************>> StartCounting: FastBreak.FastBreakProc; StopCounting: FastBreak.FastBreakProc; Record: PROCEDURE[ psbi: PrincOps.PsbIndex _ LOOPHOLE[Process.GetCurrent[]], frame: PrincOps.FrameHandle _ NIL, type: StackType _ 0, count: CARDINAL _ 1]; UserBreak: FastBreak.FastBreakProc; -- calls Record AllocationBreak: FastBreak.FastBreakProc; -- calls Record <> spyState: READONLY SpyState; watching: READONLY DataType; justMe: READONLY PrincOps.PsbIndex; <> runningTime: BasicTime.Pulses; active, starts, stops: INTEGER; pageFaults: LONG CARDINAL; wordsAllocated: LONG CARDINAL; wordsReclaimed: LONG CARDINAL; wakeups, notScheduled, skips: Count; levelData: LevelData; <> DataType: TYPE = SpyClient.DataType; SpyState: TYPE = {off, on, disabled}; Stack: TYPE = MACHINE DEPENDENT RECORD [ process: PrincOps.PsbIndex, level: Process.Priority, type: StackType, count: CARDINAL, frame: ARRAY [0..stackLength) OF Frame]; stackLength: CARDINAL = 75; stackHeader: CARDINAL = Stack.SIZE - stackLength*Frame.SIZE; StackType: TYPE = SpyClient.StackType; Frame: TYPE = MACHINE DEPENDENT RECORD[ unused: CARDINAL [0..64), gfi: PrincOps.GFTIndex, pc: PrincOps.BytePC]; Count: TYPE = INT; LevelData: TYPE = ARRAY Process.Priority OF Count; <<**********************************************************>> <> <<**********************************************************>> -- SpyBreaks procedures -- PrintBreaks: PROCEDURE[typescript: IO.STREAM]; SetAllocationBreak: PROCEDURE RETURNS[msg: ROPE]; ClearAllocationBreak: PROCEDURE; -- SpyLogReader procedures -- ZeroLog: PROCEDURE; DestroyLog: PROCEDURE; ReadLog: PROCEDURE[typescript: IO.STREAM, datatype: DataType, spyOnSpyLog: BOOL _ FALSE]; processes: LIST OF ProcessRef; modules: LIST OF Procedure; ProcessRef: TYPE = REF ProcessRec; ProcessRec: TYPE = RECORD[ psb: PrincOps.PsbIndex _ 0, level: PACKED ARRAY [0..4] OF Process.Priority _ ALL[0], calls: Count _ 0, sons: LIST OF Call _ NIL]; Procedure: TYPE = REF ProcRec; ProcRec: TYPE = RECORD [ unused: BOOLEAN _ FALSE, marked: BOOLEAN _ FALSE, -- bit for procedures that walk the stack named: BOOLEAN _ FALSE, -- have we appended the name of the procedure? symbols: BOOLEAN _ TRUE, -- are the symbols available? gfi: PrincOps.GFTIndex _ 0, -- gfi for this procedure name: ROPE _ NIL, -- the name of the procedure entryPC: CARDINAL _ 0, exitPC: CARDINAL _ LAST[CARDINAL], refs: CARDINAL _ 0, -- number of procedures that call this one count: Count _ 0, -- counts in this procedure calls: Count _ 0, -- counts in procedures called by this one container: Procedure _ NIL, -- the procedure that contains all calls to this one parents: LIST OF Procedure _ NIL, -- procedures that call this one sons: LIST OF Call _ NIL]; -- procedures called from here Call: TYPE = RECORD[ pc: CARDINAL _ 0, calls: Count _ 0, proc: Procedure _ NIL]; GFHFromGFI: PROCEDURE[gfi: PrincOps.GFTIndex] RETURNS[PrincOps.GlobalFrameHandle] = INLINE {RETURN[PrincOps.GFT[gfi].framePtr]}; END . .