<> <> DIRECTORY AMBridge, AMModel, AMModelBridge, AMModelPrivate, AMTypes, BackStop, IO, PrincOps, PrintTV, ProcessWatch, ProcessWatchPrinting, Rope, RTSymbolDefs, RTSymbols, RuntimeError, ViewerIO; ProcessWatchPrintingImpl: CEDAR MONITOR IMPORTS AMBridge, AMModel, AMModelBridge, BackStop, IO, ProcessWatch, Rope, ViewerIO EXPORTS ProcessWatchPrinting = {OPEN ProcessWatch; ROPE: TYPE = Rope.ROPE; ShowTop: PUBLIC PROC [pi: UsefulPsbIndex] = { ph: ProcessHistory = GetHistory[pi]; pName: ROPE = IO.PutFR["Process %g (%bB, %xH)", [cardinal[pi]], [cardinal[pi]], [cardinal[pi]]]; PrintIt: PROC [to: IO.STREAM] = { IF ph.lastStack.end = 0 THEN to.PutF["\n%g was never seen to execute.\n", [rope[pName]]] ELSE { fi: FrameIndex _ 0; to.PutF["\n%g, Priority %g: ", [rope[pName]], [cardinal[ph.lastPriority]]]; PrintFrame[to, ph.lastStack.frames[0]]; to.PutRope["\n"]; }; }; LetPrint[PrintIt]; }; ShowStack: PUBLIC PROC [pi: UsefulPsbIndex] = { ph: ProcessHistory = GetHistory[pi]; pName: ROPE = IO.PutFR["Process %g (%bB, %xH)", [cardinal[pi]], [cardinal[pi]], [cardinal[pi]]]; PrintIt: PROC [to: IO.STREAM] = { IF ph.lastStack.end = 0 THEN to.PutF["\n%g was never seen to execute.\n", [rope[pName]]] ELSE { fi: FrameIndex _ 0; to.PutF["\n%g, Priority %g:", [rope[pName]], [cardinal[ph.lastPriority]]]; DO glitch: BOOL _ FALSE; to.PutRope["\n\t"]; PrintFrame[to, ph.lastStack.frames[fi]]; fi _ IF fi IN [0 .. warmFrames-1) THEN fi + 1 ELSE IF fi = warmFrames-1 THEN (IF glitch _ ph.lastStack.wrapped THEN ph.lastStack.end ELSE warmFrames) ELSE IF fi = LAST[FrameIndex] THEN warmFrames ELSE (fi+1); IF fi = ph.lastStack.end AND NOT glitch THEN EXIT; IF glitch THEN to.PutRope["\n\t..."]; ENDLOOP; to.PutF["\n\t~~~ End of stack ~~~\n"]; }; }; LetPrint[PrintIt]; }; PrintFrame: PROC [to: IO.STREAM, mf: Frame] = { <> ReallyPrintFrame: PROC = TRUSTED { gfTV: AMTypes.TV = AMBridge.TVForGFHReferent[mf.gf]; gfContext: AMModel.Context = AMModelBridge.ContextForFrame[gfTV]; ls: AMModelBridge.LoadedSection = AMModelBridge.LoadedSectionForProgPC[gfContext, mf.pc]; source: AMModel.Source = AMModel.SectionSource[ls.section]; procSection, progSection: AMModel.Section; FOR procSection _ ls.section, AMModel.ParentSection[procSection] UNTIL AMModel.SectionClass[procSection] = proc DO NULL ENDLOOP; progSection _ AMModel.ParentSection[procSection]; to.PutRope[AMModel.SectionName[progSection]]; to.PutRope["."]; to.PutRope[AMModel.SectionName[procSection]]; IF mf.repeat # 1 THEN to.PutF["*%g", [cardinal[mf.repeat]]]; WITH source SELECT FROM x: REF AMModel.SourceObj.field => to.PutF["[%g]", [integer[x.firstCharIndex]]]; ENDCASE; }; errorMessage: ROPE = BackStop.Call[ReallyPrintFrame]; IF errorMessage.Length[] # 0 THEN to.PutF["Aack! %g", [rope[errorMessage]]]; }; LetPrint: ENTRY PROC [Print: PROC [IO.STREAM]] = { ENABLE UNWIND => NULL; DO thisLog: IO.STREAM = log; ok: BOOL _ thisLog # NIL; IF ok THEN Print[thisLog ! IO.EndOfStream => IF stream = thisLog THEN {ok _ FALSE; CONTINUE}; IO.Error => IF stream = thisLog AND ec = StreamClosed THEN {ok _ FALSE; CONTINUE} ]; IF ok THEN EXIT; log _ ViewerIO.CreateViewerStreams["Process Watcher Log"].out; ENDLOOP; }; log: IO.STREAM _ NIL; }.