DIRECTORY BasicTime, CedarProcess, Commander, Icons, IO, List, MakeDo, RedBlackTree, Rope, TimeStamp; MakeDoPrivate: CEDAR DEFINITIONS = BEGIN OPEN MakeDo; NodeList: TYPE = LIST OF Node; Node: TYPE = REF NodeRep; NodeRep: TYPE = RECORD [ name: ROPE, class: NodeClass, memberships: RefTable--of NodeSet--, producer: Edge _ NIL, props: PropList _ NIL, to: ARRAY ActionDep OF EdgeRingHead _ ALL[emptyHead], modifiability: Modifiability _ uninitialized, created: Time _ unknownTime, current: ExpensiveBool _ notComputed, broken: BOOL _ FALSE, consistencyAsked: BOOL _ FALSE, consistent: BOOL _ FALSE, consistencyReason: ROPE _ NIL, someoneWhoCares: Job _ NIL, state: NodeState _ inactive, waitCount: INTEGER _ 0, waitingOnCurrent: NodeList _ NIL ]; NodeState: TYPE = {inactive, ready, working, waiting}; Action: TYPE = REF ActionRep; ActionRep: TYPE = RECORD [ class: ActionClass, foundData: REF ANY, cmd: ROPE, makes: EdgeRingHead _ emptyHead, from: ARRAY ActionDep OF EdgeRingHead _ ALL[emptyHead], waitingForPermission: NodeList _ NIL, permissionGranted: BOOL _ FALSE, derivedFromCurrentDeterminers: BOOL _ TRUE, queuedFailsInvalidation: BOOL _ FALSE, fails: ExpensiveBool _ notComputed, reasonWhyLastDone: ROPE _ NIL ]; ExpensiveBool: TYPE = {notComputed, false, true} _ notComputed; Expensify: ARRAY BOOL OF ExpensiveBool = [false, true]; EdgeRingHead: TYPE = RECORD [first, last: Edge]; emptyHead: EdgeRingHead = [NIL, NIL]; Edge: TYPE = REF EdgeRep; EdgeRep: TYPE = RECORD [ optional: BOOL, n: Node, a: Action, nNext, nPrev: Edge, aNext, aPrev: Edge ]; Job: TYPE = REF JobRep; JobRep: TYPE = RECORD [ wDir: ROPE, goals, processes: RefTable, otherModifiable: ModifiabilitySpec, nSteps: NAT _ 0, failedSteps: ActionList _ NIL ]; NodeSet: TYPE = REF NodeSetPrivate; NodeSetPrivate: TYPE = RECORD [ nodes: RefTable, currents, nonCurrents: INT _ 0, broken, ok: INT _ 0 ]; NodeClass: TYPE = REF NodeClassRep; NodeClassRep: TYPE = RECORD [ name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetTime: GetTimeProc ]; debugging: BOOL; leaf: Action; Log: PROC [fmt: ROPE, v1, v2, v3, v4, v5: IO.Value _ [null[]]]; Confirm: PROC [action: ROPE]; GetCommanderHandle: PROC RETURNS [Commander.Handle]; EnumerateFinders: PROC [to: PROC [Finder]]; IncrementStepCount: PROC [Job]; AddFailedCmd: PROC [Job, Action]; EnglishList: PROC [NodeList] RETURNS [el: ROPE, ec: CARDINAL]; NodeInRefTable: PROC [n: Node, t: RefTable] RETURNS [BOOL]; IsRootGoal: PROC [job: Job, n: Node] RETURNS [BOOL]; IsLeaf: PROC [job: Job, n: Node] RETURNS [BOOL]; StartTime: PROC [n: Node]; EnumerateNodes: PROC [to: PROC [Node], andDestroy--table when done--: BOOL]; IconSeq: TYPE = REF IconSeqPrivate; IconSeqPrivate: TYPE = RECORD [icons: SEQUENCE length: NAT OF Icons.IconFlavor]; icons: IconSeq; END. DMakeDoPrivate.Mesa Last Edited by: Spreitzer, February 20, 1986 6:42:53 pm PST Mike Spreitzer July 28, 1986 7:43:13 pm PDT Carl Hauser, April 11, 1985 3:34:27 pm PST Definitions: Current[n] = if Leaf[n] then true else let a = n.producer in CorrectlyDerived[a] & (A i_a: Current[i]) & (a.Consistent[{i:i_a}, n] V Eiga: ~i.Exists[] V Ei_a: Broken[i] V a.Fails[{i:i_a}]) CorrectlyDerived[a] = A iba: Current[i] & DerivedFrom[a, i] V Eiba: Broken[i] Leaf[n] = CertainlyNotModifiable[n] V n has no producer Current[n] g Broken[n] = CertainlyModifiable[n] & ~n.Exists[] V ~CertainlyNotModifiable[n] & Ea_n: ( Ei_a: Broken[i] V Eiba: Broken[i] V CertainlyModifiable[n] & Eiga: ~i.Exists[] V A iga: i.Exists[] & a.Fails[{i:i_a}]) Basic Monitor Invariant: (eb: ExpensiveBool S b: BOOL W eb=notComputed g b=eb) ~RawLeaf[node] g node.consistencyAsked g node.consistent = node.producer.Consistent[{i:i_a}, node] node.current S Current[n] node.created dates contents used herein node.current=true g node.broken = Broken[n] NodeSets agree with nodes act.correctlyDerived g CorrectlyDerived[a] if act.permissionGranted & act.queuedFailsInvalidation then a.Fails[..] unknown else act.fails S a.Fails[..] currents counts nodes with current=true; nonCurrent counts others. Only current nodes are counted broken or ok. In Basic monitor: In node table monitor: ΚV– "cedar" style˜code™J™;K™+K™*—K˜KšΟk œ,œ.˜eK˜KšΠbx œœ œ˜"K˜Kšœœ˜K˜head™ šœ™Kšœ ™ šœ™K™KšΟmœŸœŸœ™šŸœŸœ™KšŸœŸœŸœ™KšŸœŸœŸœ ™KšŸœ Ÿœ™———Kš œŸœŸœŸœŸœŸœŸœ ™MKšœ$Ÿœ™7šœ Ÿœ ™KšœŸœ ™$šŸœŸœŸœŸœ™&Kš ŸœŸœ ŸœŸœŸœ ™!KšŸœŸœŸœŸœ™,Kš ŸœŸœŸœŸœ Ÿœ™'———K˜™Kš œŸœ ŸœŸœ Ÿœ™5šœŸœŸ™(Kšœ/Ÿœ ™9—Kšœ Ÿœ ™Kšœ'™'KšœŸœ™+K™KšœŸœ™*™KšœŸœ5™LKšœŸœ ™——K˜Kšœ œœœ˜Kšœœœ ˜šœ œœ˜Kšœœ˜ K˜KšœΟcœ˜$Kšœœ˜Kšœœ˜Kšœœ œœ ˜5Kšœ-˜-Kšœ˜K˜%Kšœœœ˜Kšœœœ˜Kšœ œœ˜Kšœœœ˜Kšœœ˜K˜Kšœ œ˜Kšœ˜ K˜—K˜Kšœ œ'˜6K˜Kšœœœ ˜šœ œœ˜K˜Kšœ œœ˜Kšœœ˜ Kšœ ˜ Kšœœ œœ ˜7Kšœ!œ˜%Kšœœœ˜ Kšœœœ˜+Kšœœœ˜&K˜#Kšœœ˜Kšœ˜—K˜Kšœœ,˜?Kšœ œœœ˜7K˜Kšœœœ˜0Kšœœœ˜%K˜Kšœœœ ˜šœ œœ˜Kšœ œ˜K˜K˜ Kšœ˜Kšœ˜K˜—K˜Kšœœœ˜šœœœ˜Kšœœ˜ Kšœ˜Kšœ#˜#Kšœœ˜Kšœ˜K˜—K˜Kšœ œœ˜#šœœœ˜K˜šœœ˜K™B—šœ œ˜K™,—K˜—K˜Kšœ œœ˜#šœœœ˜Kšœœ˜ Kš Οn œœœœœ˜)K˜K˜—K˜Kšœ œ˜K˜ K˜Kš‘œœœœ˜?Kš‘œœ œ˜Kš‘œœœ˜4K˜Kš‘œœœ ˜+K˜Kš‘œœ˜Kš‘ œœ˜!K˜Kš ‘ œœ œœœ˜>Kš‘œœœœ˜;Kš‘ œœœœ˜4Kš‘œœœœ˜0K˜™Kš‘ œœ ˜—K˜™Kš ‘œœœ œœ˜L—K˜Kšœ œœ˜#Kš œœœ œ œœ˜PK˜K˜K˜Kšœ˜—…— κ„