-- PerfInterface.mesa Edited by -- Sandman Oct 21, 1980 3:06 PM -- Karlton June 25, 1980 2:05 AM DIRECTORY FormSW USING [ AllocateItemDescriptor, ClientItemsProcType, CommandItem, Enumerated, EnumeratedItem, line0, line1, line2, line3, line4, line5, line6, line7, line8, line9, StringItem, TagOnlyItem], PerfCommonOps USING [], PerfOps USING [ BpNumToNodeID, FindIndex, GetNodeTable, GetPCR, ParamEnumNotify, ParamIndex, ParamNotify, Params], PerfPrivate USING [ AllNodes, HistClass, HistType, LegAddClass, LegIndex, LegTrackClass, NodeIndex, NoLegSlot, NullNode, Number], Runtime USING [GetBcdTime], String USING [AppendString, InvalidNumber, StringToDecimal, StringToLongNumber], Time USING [Append, Unpack], Tool USING [Create, MakeFileSW, MakeFormSW, MakeMsgSW, MakeSWsProc], Window USING [Handle, Place]; PerfInterface: PROGRAM IMPORTS FormSW, Runtime, PerfOps, String, Time, Tool EXPORTS PerfOps, PerfCommonOps =PUBLIC BEGIN OPEN PerfOps, PerfPrivate; logSW: Window.Handle ← NIL; msgSW: Window.Handle; cmdSW: Window.Handle; toolWindow: Window.Handle; herald: STRING ← [60]; Init: PROCEDURE = BEGIN title: STRING = "Performance Tool 6.0 of "L; String.AppendString[to: herald, from: title]; Time.Append[herald, Time.Unpack[Runtime.GetBcdTime[]]]; herald.length ← herald.length - 3; toolWindow ← Tool.Create[name: herald, makeSWsProc: MakeSWs]; END; MakeSWs: Tool.MakeSWsProc = BEGIN msgSW ← Tool.MakeMsgSW[window: window, lines: 1]; cmdSW ← Tool.MakeFormSW[window: window, formProc: MakeParams]; logSW ← Tool.MakeFileSW[window: window, name: "Perf.log"L]; END; monitorOn: BOOLEAN ← FALSE; fromNode: STRING ← NIL; toNode: STRING ← NIL; deleteLeg: STRING ← NIL; process: STRING ← NIL; histNode: STRING ← NIL; histLeg: STRING ← NIL; buckets: STRING ← NIL; scale: STRING ← NIL; base: STRING ← NIL; addMode: LegAddClass ← none; trackMode: LegTrackClass ← all; histClass: HistClass ← FIRST[HistClass]; histType: HistType ← FIRST[HistType]; monPlace: Window.Place = [x: 0*7, y: FormSW.line0]; collectPlace: Window.Place = [x: 20*7, y: FormSW.line0]; initPlace: Window.Place = [x: 36*7, y: FormSW.line0]; zeroPlace: Window.Place = [x: 56*7, y: FormSW.line0]; condPlace: Window.Place = [x: 0*7, y: FormSW.line1]; ptPlace: Window.Place = [x: 22*7, y: FormSW.line1]; pnPlace: Window.Place = [x: 40*7, y: FormSW.line1]; plPlace: Window.Place = [x: 57*7, y: FormSW.line1]; alPlace: Window.Place = [x: 0*7, y: FormSW.line2]; fromPlace: Window.Place = [x: 10*7, y: FormSW.line2]; toPlace: Window.Place = [x: 27*7, y: FormSW.line2]; dlPlace: Window.Place = [x: 42*7, y: FormSW.line2]; legPlace: Window.Place = [x: 54*7, y: FormSW.line2]; mcPlace: Window.Place = [x: 24*7, y: FormSW.line3]; amPlace: Window.Place = [x: 0*7, y: FormSW.line4]; tmPlace: Window.Place = [x: 30*7, y: FormSW.line4]; spPlace: Window.Place = [x: 0*7, y: FormSW.line5]; pPlace: Window.Place = [x: 20*7, y: FormSW.line5]; histPlace: Window.Place = [x: 22*7, y: FormSW.line6]; ahPlace: Window.Place = [x: 0*7, y: FormSW.line7]; dhPlace: Window.Place = [x: 8*7, y: FormSW.line7]; phPlace: Window.Place = [x: 18*7, y: FormSW.line7]; htPlace: Window.Place = [x: 28*7, y: FormSW.line7]; hcPlace: Window.Place = [x: 48*7, y: FormSW.line7]; hnPlace: Window.Place = [x: 0*7, y: FormSW.line8]; hlPlace: Window.Place = [x: 30*7, y: FormSW.line8]; bucketsPlace: Window.Place = [x: 0*7, y: FormSW.line9]; scalePlace: Window.Place = [x: 20*7, y: FormSW.line9]; basePlace: Window.Place = [x: 40*7, y: FormSW.line9]; MakeParams: FormSW.ClientItemsProcType = BEGIN OPEN FormSW; addEnumRec: ARRAY LegAddClass OF Enumerated ← [[string: "none"L, value: LegAddClass[none]], [string: "successor"L, value: LegAddClass[successor]]]; trackEnumRec: ARRAY LegTrackClass OF Enumerated ← [[string: "none"L, value: LegTrackClass[none]], [string: "successor"L, value: LegTrackClass[successor]], [string: "all"L, value: LegTrackClass[all]]]; histClassEnumRec: ARRAY HistClass OF Enumerated ← [[string: "linear"L, value: HistClass[linear]], [string: "log"L, value: HistClass[log]]]; histTypeEnumRec: ARRAY HistType OF Enumerated ← [[string: "node"L, value: HistType[node]], [string: "leg"L, value: HistType[leg]]]; monitorEnumRec: ARRAY BOOLEAN OF Enumerated ← [[string: "off"L, value: FALSE], [string: "on"L, value: TRUE]]; nParams: CARDINAL = LOOPHOLE[LAST[ParamIndex], CARDINAL] + 1; params: Params ← LOOPHOLE[AllocateItemDescriptor[nParams]]; params[mon] ← EnumeratedItem[ tag: "Monitor"L, place: monPlace, feedback: all, choices: LOOPHOLE[DESCRIPTOR[monitorEnumRec]], proc: ParamEnumNotify, value: @monitorOn]; params[collect] ← CommandItem[ tag: "Collect Nodes"L, place: collectPlace, proc: ParamNotify]; params[init] ← CommandItem[ tag: "Initialize Tables"L, place: initPlace, proc: ParamNotify]; params[zero] ← CommandItem[ tag: "Zero Tables"L, place: zeroPlace, proc: ParamNotify]; params[condition] ← CommandItem[ tag: "Condition Breaks"L, place: condPlace, proc: ParamNotify]; params[printtables] ← CommandItem[ tag: "Print Tables"L, place: ptPlace, proc: ParamNotify]; params[printnodes] ← CommandItem[ tag: "Print Nodes"L, place: pnPlace, proc: ParamNotify]; params[printlegs] ← CommandItem[ tag: "Print Legs"L, place: plPlace, proc: ParamNotify]; params[addleg] ← CommandItem[ tag: "Add Leg"L, place: alPlace, proc: ParamNotify]; params[from] ← StringItem[ tag: "From Node"L, place: fromPlace, string: @fromNode, inHeap: TRUE]; params[to] ← StringItem[ tag: "To Node"L, place: toPlace, string: @toNode, inHeap: TRUE]; params[delete] ← CommandItem[ tag: "Delete Leg"L, place: dlPlace, proc: ParamNotify]; params[leg] ← StringItem[ tag: "Leg"L, place: legPlace, string: @deleteLeg, inHeap: TRUE]; params[mode] ← TagOnlyItem[tag: "Mode Commands"L, place: mcPlace]; params[add] ← EnumeratedItem[ tag: "Add"L, place: amPlace, feedback: all, choices: LOOPHOLE[DESCRIPTOR[addEnumRec]], proc: ParamEnumNotify, value: @addMode]; params[track] ← EnumeratedItem[ tag: "Track"L, place: tmPlace, feedback: all, value: @trackMode, choices: LOOPHOLE[DESCRIPTOR[trackEnumRec]], proc: ParamEnumNotify]; params[setProcess] ← CommandItem[ tag: "Set Process"L, place: spPlace, proc: ParamNotify]; params[process] ← StringItem[ tag: "Process"L, place: pPlace, string: @process, inHeap: TRUE]; params[histcommands] ← TagOnlyItem[ tag: "Histogram Commands"L, place: histPlace]; params[addhist] ← CommandItem[tag: "Add"L, place: ahPlace, proc: ParamNotify]; params[delhist] ← CommandItem[ tag: "Delete"L, place: dhPlace, proc: ParamNotify]; params[printhist] ← CommandItem[ tag: "Print"L, place: phPlace, proc: ParamNotify]; params[histType] ← EnumeratedItem[ tag: "Type"L, place: htPlace, feedback: all, value: @histType, choices: LOOPHOLE[DESCRIPTOR[histTypeEnumRec]]]; params[histClass] ← EnumeratedItem[ tag: "Class"L, place: hcPlace, feedback: all, value: @histClass, choices: LOOPHOLE[DESCRIPTOR[histClassEnumRec]]]; params[histNode] ← StringItem[ tag: "Histogram Node"L, place: hnPlace, string: @histNode, inHeap: TRUE]; params[histLeg] ← StringItem[ tag: "Histogram Leg"L, place: hlPlace, string: @histLeg, inHeap: TRUE]; params[buckets] ← StringItem[ tag: "Buckets"L, place: bucketsPlace, string: @buckets, inHeap: TRUE]; params[scale] ← StringItem[ tag: "Scale"L, place: scalePlace, string: @scale, inHeap: TRUE]; params[base] ← StringItem[ tag: "Base"L, place: basePlace, string: @base, inHeap: TRUE]; RETURN[LOOPHOLE[params], TRUE]; END; GetFromNode: PROCEDURE RETURNS [node: NodeIndex] = {RETURN[GetNode[fromNode]]}; GetToNode: PROCEDURE RETURNS [node: NodeIndex] = {RETURN[GetNode[toNode]]}; GetNode: PROCEDURE [s: STRING] RETURNS [node: NodeIndex] = BEGIN OPEN String; bpNum: CARDINAL ← 0; node ← NullNode; bpNum ← StringToDecimal[ s ! InvalidNumber => { node ← IF toNode.length = 1 AND toNode[0] = '* THEN AllNodes ELSE NullNode; CONTINUE}]; IF bpNum = 0 THEN RETURN; node ← FindIndex[BpNumToNodeID[bpNum], GetNodeTable[read], GetPCR[read]]; RETURN END; GetDeleteLeg: PROCEDURE RETURNS [leg: LegIndex] = BEGIN leg ← String.StringToDecimal[ deleteLeg ! String.InvalidNumber => BEGIN leg ← NoLegSlot; CONTINUE END]; RETURN END; GetHistNode: PROCEDURE RETURNS [node: NodeIndex] = BEGIN node ← GetNode[histNode]; IF node = AllNodes THEN node ← NullNode; RETURN END; GetHistLeg: PROCEDURE RETURNS [leg: LegIndex] = BEGIN leg ← String.StringToDecimal[ histLeg ! String.InvalidNumber => BEGIN leg ← NoLegSlot; CONTINUE END]; RETURN END; GetBuckets: PROCEDURE RETURNS [nBuckets: CARDINAL] = BEGIN nBuckets ← String.StringToDecimal[ buckets ! String.InvalidNumber => BEGIN nBuckets ← 0; CONTINUE END]; RETURN END; GetScale: PROCEDURE RETURNS [s: CARDINAL] = BEGIN s ← String.StringToDecimal[ scale ! String.InvalidNumber => BEGIN s ← NullNode; CONTINUE END]; RETURN END; GetBase: PROCEDURE RETURNS [b: Number] = BEGIN b ← String.StringToLongNumber[ base, 10 ! String.InvalidNumber => BEGIN b ← 0; CONTINUE END]; RETURN END; -- Mainline code Init[]; END...