DIRECTORY AMBridge USING[ GFHFromTV, SetTVFromLC, TVForFrame, TVToCardinal, GetWorld, IsRemote, RemoteGFHFromTV, RemoteGlobalFrameHandle, TVForRemoteFrame ], AMEventsPrivate USING[ Outcome, ProvokeProcessEvent ], AMModel USING[ Context, ContextChildren, ContextClass, ContextWorld ], AMProcess USING[ nullProcess, Process, State ], AMProcessBasic USING[ Abort, GFTable, GFTableObject, Info, Thaw ], AMTypes USING[ Error, New, TV, TVType, TypeClass ], IO USING[ PutFR ], PrincOps USING[ FrameHandle, GlobalFrameHandle, PDA, PsbIndex, StartPsb ], Rope USING[ ROPE ], WorldVM USING[ Address, CurrentIncarnation, LocalWorld, Read, ShortAddress, World ]; AMProcessImpl: MONITOR IMPORTS AMBridge, AMEventsPrivate, AMModel, AMProcessBasic, AMTypes, IO, WorldVM EXPORTS AMProcess = BEGIN Process: TYPE = AMProcess.Process; nullProcess: Process = AMProcess.nullProcess; PSBI: TYPE = PrincOps.PsbIndex; PSBIToTV: PUBLIC PROC[world: WorldVM.World, psbi: PrincOps.PsbIndex] RETURNS[p: Process] = BEGIN p _ AMTypes.New[CODE[PROCESS], mutable, world]; AMBridge.SetTVFromLC[p, psbi]; END; TVToPSBI: PUBLIC PROC[p: Process] RETURNS[world: WorldVM.World, psbi: PSBI] = BEGIN IF AMTypes.TypeClass[AMTypes.TVType[p]] # process THEN ERROR AMTypes.Error[typeFault, "TV should be for a process", AMTypes.TVType[p] ]; psbi _ AMBridge.TVToCardinal[p]; world _ AMBridge.GetWorld[p]; END; GetProcesses: PUBLIC ENTRY PROC[context: LIST OF AMModel.Context _ NIL, states: LIST OF AMProcess.State] RETURNS[l: LIST OF Process] = BEGIN ENABLE UNWIND => NULL; world: WorldVM.World = IF context = NIL THEN WorldVM.LocalWorld[] ELSE AMModel.ContextWorld[context.first]; count: CARDINAL = WorldVM.Read[world, LOOPHOLE[@PrincOps.PDA.count, WorldVM.Address]]; filter: GFTable = ContextFrames[context, world]; l _ NIL; FOR psbi: PSBI DECREASING IN [PrincOps.StartPsb .. PrincOps.StartPsb + count) DO state: AMProcess.State; frame: PrincOps.FrameHandle; [state: state, frame: frame] _ PrincOpsInfo[world, psbi, TRUE, FALSE, TRUE, filter, states]; IF state # dead AND frame # NIL THEN l _ CONS[first: PSBIToTV[world, psbi], rest: l]; ENDLOOP; END; Name: PUBLIC PROC[p: Process] RETURNS[Rope.ROPE] = BEGIN psbi: PSBI; world: WorldVM.World; [world, psbi] _ TVToPSBI[p]; RETURN[IO.PutFR["PSB %bB", [cardinal[psbi]]]] END; Freeze: PUBLIC PROC[processes: LIST OF Process, context: LIST OF AMModel.Context _ NIL] = { FreezeOrAdjust[processes, context, FALSE] }; Adjust: PUBLIC PROC[processes: LIST OF Process, context: LIST OF AMModel.Context _ NIL] = { FreezeOrAdjust[processes, context, TRUE] }; FreezeOrAdjust: ENTRY PROC[l: LIST OF Process, context: LIST OF AMModel.Context, thaw: BOOL] = BEGIN world: WorldVM.World = IF context = NIL THEN WorldVM.LocalWorld[] ELSE AMModel.ContextWorld[context.first]; filter: GFTable = ContextFrames[context, world]; FOR this: LIST OF Process _ l, this.rest UNTIL this = NIL DO psbi: PSBI; pWorld: WorldVM.World; [pWorld, psbi] _ TVToPSBI[this.first]; IF pWorld = world THEN [] _ PrincOpsInfo[world, psbi, TRUE, thaw, FALSE, filter]; ENDLOOP; END; Thaw: PUBLIC PROC[l: LIST OF Process] = BEGIN FOR this: LIST OF Process _ l, this.rest UNTIL this = NIL DO psbi: PSBI; world: WorldVM.World; [world, psbi] _ TVToPSBI[this.first]; AMProcessBasic.Thaw[world, psbi]; ENDLOOP; END; GetState: PUBLIC ENTRY PROC[p: Process] RETURNS[ state: AMProcess.State, faultData: LONG CARDINAL _ 0, priority: [0..7], stack: AMTypes.TV _ NIL, topFrame: BOOL ] = BEGIN ENABLE UNWIND => NULL; psbi: PSBI; world: WorldVM.World; frozenFrame, current: PrincOps.FrameHandle; [world, psbi] _ TVToPSBI[p]; [state:state, faultData:faultData, priority:priority, frozenFrame:frozenFrame, topFrame:current] _ PrincOpsInfo[world: world, psbi: psbi, fullStatus: TRUE]; topFrame _ frozenFrame = current; IF frozenFrame # NIL THEN stack _ FrameToTV[world, frozenFrame] ELSE stack _ NIL; END; NotImplemented: ERROR = CODE; CallDebugger: PUBLIC PROC[p: Process, msg: Rope.ROPE] = BEGIN psbi: PSBI; world: WorldVM.World; frozenFrame: PrincOps.FrameHandle; [world, psbi] _ TVToPSBI[p]; frozenFrame _ PrincOpsInfo[world: world, psbi: psbi].frozenFrame; IF frozenFrame = NIL THEN frozenFrame _ PrincOpsInfo[world: world, psbi: psbi, freeze: TRUE].frozenFrame; IF frozenFrame # NIL THEN BEGIN outcome: AMEventsPrivate.Outcome _ AMEventsPrivate.ProvokeProcessEvent[p, FrameToTV[world, frozenFrame], msg]; WITH o: outcome SELECT FROM proceed => NULL; quit => Abort[p]; retry, returnFrom => ERROR NotImplemented[]; ENDCASE => ERROR; END; END; LocalOnly: PUBLIC ERROR = CODE; Abort: PUBLIC PROC[p: Process] = BEGIN psbi: PSBI; world: WorldVM.World; [world, psbi] _ TVToPSBI[p]; AMProcessBasic.Abort[world, psbi]; END; GFTable: TYPE = AMProcessBasic.GFTable; gfTable: GFTable _ NEW[AMProcessBasic.GFTableObject[100]]; ContextFrames: INTERNAL PROC[context: LIST OF AMModel.Context, world: WorldVM.World] RETURNS[filter: GFTable] = BEGIN Add: PROC[gfh: PrincOps.GlobalFrameHandle] = BEGIN IF filter.count = filter.length THEN BEGIN old: GFTable = filter; filter _ NEW[AMProcessBasic.GFTableObject[filter.length+100]]; FOR i: CARDINAL IN [0..old.count) DO filter[i] _ old[i] ENDLOOP; filter.count _ old.count; END; filter[filter.count] _ gfh; filter.count _ filter.count+1; END; Enum: PROC[child: AMModel.Context] RETURNS[stop: BOOL] = BEGIN IF AMBridge.IsRemote[child] THEN BEGIN gfh: AMBridge.RemoteGlobalFrameHandle = AMBridge.RemoteGFHFromTV[child]; Add[LOOPHOLE[gfh.gfh]]; END ELSE Add[AMBridge.GFHFromTV[child]]; stop _ FALSE; END; IF context = NIL THEN filter _ NIL ELSE BEGIN filter _ gfTable; filter.count _ 0; FOR this: LIST OF AMModel.Context _ context, context.rest UNTIL this = NIL DO IF AMModel.ContextWorld[this.first] = world THEN SELECT AMModel.ContextClass[this.first] FROM world => { filter _ NIL; EXIT }; model => [] _ AMModel.ContextChildren[this.first, Enum]; prog => [] _ Enum[this.first]; ENDCASE => ERROR; ENDLOOP; END; END; PrincOpsInfo: PROC[world: WorldVM.World, psbi: CARDINAL, freeze: BOOL _ FALSE, thaw: BOOL _ FALSE, fullStatus: BOOL _ FALSE, filter: GFTable _ NIL, states: LIST OF AMProcess.State _ NIL] RETURNS[ state: AMProcess.State, faultData: LONG CARDINAL, priority: [0..7], frame: PrincOps.FrameHandle, frozenFrame: PrincOps.FrameHandle, topFrame: PrincOps.FrameHandle] = BEGIN wantedStates: PACKED ARRAY AMProcess.State OF BOOL _ ALL[FALSE]; IF states = NIL THEN wantedStates _ ALL[TRUE] ELSE FOR s: LIST OF AMProcess.State _ states, s.rest UNTIL s = NIL DO wantedStates[s.first] _ TRUE ENDLOOP; [state, faultData, priority, frame, frozenFrame, topFrame] _ AMProcessBasic.Info[world, psbi, freeze, thaw, fullStatus, filter, wantedStates ]; END; FrameToTV: PROC[world: WorldVM.World, frame: PrincOps.FrameHandle] RETURNS[AMTypes.TV] = { RETURN[ IF frame = NIL THEN NIL ELSE IF world = WorldVM.LocalWorld[] THEN AMBridge.TVForFrame[frame] ELSE AMBridge.TVForRemoteFrame[ [world: world, worldIncarnation: WorldVM.CurrentIncarnation[world], fh: LOOPHOLE[frame, WorldVM.ShortAddress]] ] ] }; END. Cedar Remote Debugging: processes AMProcessImpl.mesa Andrew Birrell August 2, 1983 12:19 pm Russ Atkinson, January 19, 1983 9:12 pm ReturnFrom: PUBLIC PROC[p: Process, frame: AMTypes.TV, result: AMTypes.TV] = Retry: PUBLIC PROC[p: Process, frame: AMTypes.TV, args: AMTypes.TV] = Ê y˜J˜Jšœ!™!Jšœ™Jšœ'™'Jšœ'™'J˜šÏk ˜ Jšœ œ…˜“Jšœœ!˜6Jšœœ9˜FJšœ œ ˜/Jšœœ.˜BJšœœœ˜3Jšœœ ˜Jšœ œ"œ˜JJšœœœ˜JšœœG˜T—J˜šœ˜Jšœ>œ ˜PJšœ ˜—J˜Jš˜J˜Jšœ œ˜"J˜J˜-J˜Jšœœ˜J˜šÏnœœœ0œ˜ZJš˜Jšœœœ˜/J˜Jšœ˜J˜—š žœœœ œœ˜MJš˜Jšœ/˜1JšœœL˜VJ˜ J˜Jšœ˜J˜—šž œœœœ œœœ˜GJšœœœ˜ Jšœœœ ˜Jš˜Jšœœœ˜˜Jšœ œœœ%˜T—Jšœœœ œ˜VJ˜0Jšœœ˜Jšœœ œœ1˜Mšœ˜J˜˜Jšœœœœ˜=—Jšœœ ˜Jšœœ(˜5—Jšœ˜Jšœ˜J˜—š žœœœ œœ˜2Jš˜Jšœœ˜ J˜J˜Jšœœ$˜-Jšœ˜J˜—šžœœœ œœœœœ˜YJšœ%œ˜.J˜—šžœœœ œœœœœ˜YJšœ%œ˜-J˜—šžœœœœœœœœ˜^Jš˜˜Jšœ œœœ%˜T—J˜0Jš œœœœ˜9šœœ˜J˜J˜&Jšœ˜Jšœ œœ ˜?—Jšœ˜Jšœ˜J˜—š žœœœœœ ˜'Jš˜Jš œœœœ˜9šœœ˜J˜J˜%J˜!—Jšœ˜Jšœ˜J˜—š žœœœœ œ˜0J˜Jšœ œœ˜J˜Jšœœœ˜Jšœ œ˜Jš˜Jšœœœ˜Jšœœ˜ J˜J˜+J˜˜bJšœ3œ˜9—J˜!Jšœ˜Jšœ&˜*Jšœ œ˜Jšœ˜J˜—Jšœœœ˜J˜šž œœœœ˜7Jš˜Jšœœ˜ J˜J˜"J˜J˜AJšœ˜Jšœ>œ˜TJšœ˜šœ˜ ˜"J˜K—šœ œ˜Jšœ œ˜J˜Jšœœ˜,—Jšœœ˜Jšœ˜—Jšœ˜J˜J˜J˜—Jšœ œœœ˜J˜šžœœœ˜ Jš˜Jšœœ˜ J˜J˜J˜"Jšœ˜J˜—JšœL™LJ˜JšœE™EJ˜J˜J˜Jšœ œ˜'Jšœœ$˜:J˜š ž œœœ œœ'˜TJšœ˜Jš˜šžœœ#˜,Jš˜Jšœ˜šœ˜ Jšœ˜Jšœ œ2˜>Jš œœœœœ˜@J˜Jšœ˜—J˜J˜Jšœ˜—šžœœœœ˜8Jš˜Jšœ˜šœ˜ J˜HJšœœ ˜Jš˜—Jšœ ˜$Jšœœ˜ Jšœ˜—Jšœ ˜Jšœ ˜šœ˜ Jšœ$˜$Jš œœœ)œ˜Jšœœ)˜.šœœ"˜1Jšœœœ˜ J˜8J˜Jšœœ˜——Jšœ˜Jšœ˜—Jšœ˜J˜—šž œœ˜(Jšœœ˜Jšœœœ˜Jšœœœ˜Jšœ œœ˜Jšœœ˜Jšœœœœ˜&šœ˜J˜Jšœ œœ˜J˜J˜J˜"J˜!—Jš˜Jš œœœœœœœ˜@Jšœ ˜Jšœœœ˜š œœœœ"œ˜BJšœœœ˜(—˜