DIRECTORY Basics, BasicTime, CedarProcess, Commander, CommandTool, IO, List, MakeDo, MakeDoPrivate, Menus, PrincOpsUtils, Process, ProcessProps, RedBlackTree, Rope, ViewerClasses, ViewerIO; MakeDoAuxImpl: CEDAR MONITOR IMPORTS BasicTime, IO, List, MakeDo, MakeDoPrivate, ProcessProps, RedBlackTree, Rope EXPORTS MakeDo, MakeDoPrivate = BEGIN OPEN MakeDo, MakeDoPrivate; NodeRep: PUBLIC TYPE = MakeDoPrivate.NodeRep; CommandRep: PUBLIC TYPE = MakeDoPrivate.CommandRep; visitCount: CARDINAL _ 0; chKey: ATOM _ $CommanderHandle; GetCommanderHandle: PUBLIC PROC RETURNS [ch: Commander.Handle] = { ch _ NARROW[List.Assoc[chKey, ProcessProps.GetPropList[]]]; IF ch = NIL THEN ERROR; }; fineTime: BOOL _ FALSE; Log: PUBLIC PROC [depth: INTEGER, fmt: ROPE, v1, v2, v3, v4, v5: IO.Value _ [null[]]] = BEGIN out: IO.STREAM _ GetCommanderHandle[].out; IF fineTime THEN out.PutF["%g:", IO.card[BasicTime.GetClockPulses[]]]; FOR i: INT IN [0 .. depth) DO out.PutChar['\t] ENDLOOP; out.PutF[fmt, v1, v2, v3, v4, v5]; out.PutChar['\n]; END; Confirm: PUBLIC PROC [depth: INTEGER, action: ROPE] = BEGIN ch: Commander.Handle = GetCommanderHandle[]; in: IO.STREAM = ch.in; out: IO.STREAM = ch.out; FOR i: INT IN [0 .. depth) DO out.PutChar['\t] ENDLOOP; out.PutF["Ready to %g ? ", IO.rope[action]]; WHILE in.GetChar[] # '\n DO NULL ENDLOOP; END; NewVisit: PUBLIC ENTRY PROC RETURNS [v: Visit] = { v _ [visitCount _ visitCount+1]; }; IncrementStepCount: PUBLIC ENTRY PROC [job: Job] = { ENABLE UNWIND => {}; job.nSteps _ job.nSteps + 1; }; AddFailedCmd: PUBLIC ENTRY PROC [job: Job, c: Command] = { ENABLE UNWIND => {}; job.failedSteps _ CONS[c, job.failedSteps]; }; AddCommand: PUBLIC ENTRY PROC [job: Job, cmd: ROPE] = { ENABLE UNWIND => {}; job.cmds _ job.cmds.Cat[cmd, "\n"]; }; nodes: Table _ MakeNodeTable[]; DestroyGraph: PUBLIC ENTRY PROC = { ENABLE UNWIND => NULL; DestroyNode: INTERNAL PROC [data: REF ANY] RETURNS [stop: BOOL _ FALSE] --RedBlackTree.EachNode-- = { n: Node = NARROW[data]; IF n.producer # NIL AND n.producer.c # NIL THEN DestroyCmd[n.producer.c]; IF n.producer # NIL THEN n.producer.c _ NIL; n.producer _ NIL; n.class _ NIL; n.props _ NIL; n.lockedOuts _ NIL; }; DestroyCmd: INTERNAL PROC [c: Command] = { RemoveConsumption[c, cmd]; RemoveConsumption[c, data]; WHILE c.makes.first # NIL DO UnlinkMake[c.makes.first]; ENDLOOP; c.class _ NIL; c.foundData _ NIL; c.missedSources _ NIL; c.lockedOuts _ NIL; }; DestroyQueues[]; nodes.EnumerateIncreasing[DestroyNode]; nodes.DestroyTable[]; }; UnlinkMake: INTERNAL PROC [e: Edge] = { n: Node = e.n; c: Command = e.c; IF e.nNext # NIL OR e.nPrev # NIL THEN ERROR; n.producer _ NIL; IF e.cNext # NIL THEN e.cNext.cPrev _ e.cPrev ELSE c.makes.last _ e.cPrev; IF e.cPrev # NIL THEN e.cPrev.cNext _ e.cNext ELSE c.makes.first _ e.cNext; e.cNext _ e.cPrev _ NIL; }; SuspectAll: PUBLIC ENTRY PROC [change, remake: BOOL] = { ENABLE UNWIND => NULL; stack: Table = NewRefTable[]; PerNode: PROC [data: REF ANY] RETURNS [stop: BOOL _ FALSE] --RedBlackTree.EachNode-- = { n: Node = NARROW[data]; IF change THEN SuspectNodeChange[n, stack]; IF remake THEN SuspectProducer[n, stack]; }; nodes.EnumerateIncreasing[PerNode]; }; NewRefTable: PUBLIC PROC RETURNS [table: Table] = {table _ RedBlackTree.Create[IdGetKey, CompareRefs]}; MakeNodeTable: PUBLIC PROC RETURNS [table: Table] = {table _ RedBlackTree.Create[IdGetKey, CompareNodes]}; AddNodeToTable: PUBLIC PROC [n: Node, t: Table] = {t.Insert[n, n]}; NodeInTable: PUBLIC PROC [n: Node, t: Table] RETURNS [BOOL] = { in: BOOL _ t.Lookup[n] # NIL; RETURN [in]}; IsRootGoal: PUBLIC PROC [job: Job, n: Node] RETURNS [BOOL] = {RETURN [NodeInTable[n, job.goals]]}; GetNode: PUBLIC ENTRY PROC [someName: ROPE, class: NodeClass, mayAdd: BOOL _ TRUE] RETURNS [node: Node] = { ENABLE UNWIND => NULL; canonicalName: ROPE _ IF class # NIL THEN class.CanonizeName[someName] ELSE someName; IF (node _ NARROW[nodes.Lookup[canonicalName]]) = NIL AND mayAdd THEN { node _ NEW [NodeRep _ [name: canonicalName, class: class, down: NewMonitorLock[]]]; nodes.Insert[node, node]; } ELSE IF node = NIL THEN NULL ELSE IF node.class = NIL THEN node.class _ class ELSE IF class # NIL AND class # node.class THEN ERROR; }; Exists: PUBLIC PROC [n: Node] RETURNS [exists: BOOL] = {exists _ GetCreated[n] # notExistTime}; IdGetKey: PUBLIC PROC [data: REF ANY] RETURNS [REF ANY] --RedBlackTree.GetKey-- = {RETURN[data]}; CompareNodes: PUBLIC PROC [k, data: REF ANY] RETURNS [Basics.Comparison] --RedBlackTree.Compare-- = BEGIN GetKey: PROC [ra: REF] RETURNS[r: ROPE] = { r _ WITH ra SELECT FROM n: Node => n.name, x: ROPE => x, ENDCASE => ERROR}; k1: ROPE _ GetKey[k]; k2: ROPE _ GetKey[data]; RETURN [k1.Compare[s2: k2, case: FALSE]]; END; CompareRefs: PUBLIC PROC [k, data: REF ANY] RETURNS [Basics.Comparison] --RedBlackTree.Compare-- = TRUSTED BEGIN k1: INT _ LOOPHOLE[k]; k2: INT _ LOOPHOLE[data]; RETURN [SELECT k1 FROM < k2 => less, = k2 => equal, > k2 => greater, ENDCASE => ERROR]; END; END. <MakeDoAuxImpl.Mesa Last Edited by: Spreitzer, September 4, 1985 10:57:35 pm PDT INVARIANT logs describes allocation of log viewers. visitCount is unique for each invocation of NewVisit. c.lastVisit = visit => c.computed says whether to think hard. dependency graph is reachable from nodes. Job is consistent. ΚX– "cedar" style˜code™J™<—K˜KšΟk œ:œx˜½K˜šΠbx œœ˜Kšœ œ?˜TKšœ˜Kšœ˜™ K™)Kšœ5™5K™=K™)K™——K˜Kšœœ˜!K˜Kšœ œœ˜-Kšœ œœ˜3K˜Kšœ œ˜K˜Kšœœ˜K˜šΟnœœœœ˜BJšœœ0˜;Jšœœœœ˜K˜—K˜Kšœ œœ˜K˜š Ÿœœœ œœœ˜WKš˜Kšœœœ˜*Kšœ œœ#˜FKš œœœœœ˜7Kšœ"˜"Kšœ˜Kšœ˜—K˜š Ÿœœœ œ œ˜5Kš˜Kšœ,˜,Jšœœœ ˜Jšœœœ ˜Kš œœœœœ˜7Kšœœ˜,Kšœœœœ˜)Kšœ˜—K˜š Ÿœœœœœ˜2K˜ K˜—K˜šŸœœœœ˜4Kšœœ˜Kšœ˜K˜—K˜šŸ œœœœ˜:Kšœœ˜Kšœœ˜+K˜—K˜š Ÿ œœœœœ˜7Kšœœ˜Kšœ#˜#K˜—K˜Kšœ˜K˜šŸ œœœœ˜#Kšœœœ˜šŸ œœœœœœœœΟcœ˜eKšœ œ˜Kš œœœœœ˜IKšœœœœ˜,Kšœ œ˜Kšœ œ˜Kšœ œ˜Kšœœ˜K˜—šŸ œœœ˜*K˜K˜šœœ˜K˜Kšœ˜—Kšœ œ˜Kšœœ˜Kšœœ˜Kšœœ˜K˜—K˜K˜'K˜K˜—K˜šŸ œœœ˜'K˜K˜Kš œ œœ œœœ˜-Kšœ œ˜Kšœ œœœ˜JKšœ œœœ˜KKšœœ˜K˜—K˜š Ÿ œœœœœ˜8Kšœœœ˜K˜šŸœœœœœœœ œ˜XKšœ œ˜Kšœœ˜+Kšœœ˜)K˜—Kšœ#˜#K˜—K˜šŸ œœœœ˜1Kšœ5˜5—K˜šŸ œœœœ˜3Kšœ6˜6—K˜šŸœœœ˜1Kšœ˜—K˜š Ÿ œœœœœ˜?Kšœœœ˜Kšœ˜ —K˜š Ÿ œœœœœ˜