DIRECTORY TiogaRefresh, MonitoredQueue USING [Create, MQ, Remove], Process USING [Detach, SetPriority, priorityNormal], TiogaDocument USING [GetViewerForRoot, SelectionId, TiogaDocumentData], TiogaLocks USING [RegisterForCallAfterReleaseWriteLock], TiogaNode USING [Ref], TiogaTouchup USING [refresh, RefreshOver], ViewerClasses USING [Viewer], ViewerOps USING [PaintViewer]; TiogaRefreshImpl: CEDAR MONITOR IMPORTS MonitoredQueue, Process, TiogaDocument, TiogaLocks, TiogaTouchup, ViewerOps EXPORTS TiogaRefresh = BEGIN dirtyDocs: PUBLIC MonitoredQueue.MQ _ MonitoredQueue.Create[]; processCount, scrollProcessCount: INTEGER _ 0; maxProcesses: INTEGER = 10; -- max number of concurrent refresh processes done: CONDITION; DecCount: ENTRY PROC = { processCount _ processCount-1; NOTIFY done }; Refresh: PROC = { TRUSTED {Process.SetPriority[Process.priorityNormal]}; DO doc: TiogaNode.Ref; viewer: ViewerClasses.Viewer; RefreshIt: ENTRY PROC [viewer: ViewerClasses.Viewer] = { WHILE processCount >= maxProcesses DO WAIT done; ENDLOOP; processCount _ processCount+1; TRUSTED {Process.Detach[FORK RefreshViewer[viewer ! ABORTED => CONTINUE]]} }; doc _ NARROW[MonitoredQueue.Remove[dirtyDocs]]; viewer _ TiogaDocument.GetViewerForRoot[doc]; IF viewer=NIL THEN LOOP; RefreshIt[viewer]; IF viewer.link # NIL THEN FOR v: ViewerClasses.Viewer _ viewer.link, v.link UNTIL v=viewer DO RefreshIt[v]; ENDLOOP; ENDLOOP }; RefreshViewer: PROC [viewer: ViewerClasses.Viewer] = { tdd: TiogaDocument.TiogaDocumentData = NARROW[viewer.data]; IF tdd = NIL THEN RETURN; [] _ TiogaLocks.LockDocAndTdd[tdd, "RefreshViewer", read]; tdd.invisible _ TRUE; -- will be reset by our paint proc if it is called ViewerOps.PaintViewer[viewer, client, FALSE, TiogaTouchup.refresh]; IF tdd.invisible THEN TiogaTouchup.RefreshOver[]; DecCount[]; TiogaLocks.UnlockDocAndTdd[tdd] }; ScrollToEndOfDoc: PUBLIC PROC [viewer: ViewerClasses.Viewer, glitch: BOOL] = { tdd: TiogaDocument.TiogaDocumentData = NARROW[viewer.data]; tdd.scroll _ endofdoc; tdd.scrollGlitch _ glitch }; ScrollToEndOfSel: PUBLIC PROC [viewer: ViewerClasses.Viewer, glitch: BOOL, id: TiogaDocument.SelectionId _ primary] = { tdd: TiogaDocument.TiogaDocumentData = NARROW[viewer.data]; tdd.scroll _ endofsel; tdd.scrollGlitch _ glitch; tdd.scrollSelectionId _ id }; DirtyDoc: PROCEDURE [doc: TiogaNode.RefBranchNode] = { viewer: ViewerClasses.Viewer; IF (viewer _ TiogaDocument.GetViewerForRoot[doc]) # NIL THEN { MarkDirty: PROC [v: ViewerClasses.Viewer] = { tdd: TiogaDocument.TiogaDocumentData _ NARROW[v.data]; IF tdd#NIL THEN tdd.dirty _ TRUE }; MarkDirty[viewer]; IF viewer.link # NIL THEN FOR v: ViewerClasses.Viewer _ viewer.link, v.link UNTIL v=viewer DO MarkDirty[v]; ENDLOOP; MonitoredQueue.AddToSet[doc, dirtyDocs] }; }; TRUSTED {Process.Detach[FORK Refresh[]]}; TiogaLock.RegisterForCallAfterReleaseWriteLock[DirtyDoc]; END. ¦-- TiogaRefreshImpl.mesa Edited by Paxton on June 14, 1983 3:41 pm Last Edited by: Maxwell, January 6, 1983 11:35 am in case we're waiting in LockAfterRefresh Κr˜JšΟc-œ™BJ™1šΟk ˜ J˜ Jšœžœ žœ˜*Jšœžœ'˜4Jšœžœ4˜GJšœ žœ(˜8Jšœ žœ˜Jšœ žœ˜*Jšœžœ ˜Jšœ žœ˜J˜—Jšœž ˜J˜JšžœL˜SJšžœž˜J˜Jšœ žœžœ˜>J˜Jšœ"žœ˜.Jšœžœ-˜IJšœž œ˜J˜šΟnœžœžœ˜Jšœžœ˜-—J˜šŸœžœ˜Jšžœ/˜6šž˜Jšœ˜Jšœ˜šŸ œžœžœ#˜8Jšžœžœžœžœ˜9Jšœž˜Jšžœžœžœžœ˜M—Jšœžœ#˜/Jšœ-˜-Jšžœžœžœžœ˜Jšœ˜šžœžœž˜šžœ/žœ ž˜CJšœžœ˜——Jšžœ˜ ——J˜šŸ œžœ#˜6Jšœ'žœ˜;Jšžœžœžœžœ˜Jšœ:˜:Jšœžœ2˜HJšœ&žœ˜Cšžœžœ˜1Jš)™)—Jšœ ˜ Jšœ"˜"J˜—šŸœž œ(žœ˜NJšœ'žœ˜;Jšœ3˜3J˜—šŸœž œ(žœ˜JJšœ,˜,Jšœ'žœ˜;JšœO˜OJ˜—šŸœž œ#˜6Icodešœ˜šžœ2žœžœ˜>šŸ œžœ˜-Kšœ'žœ ˜6Kšžœžœžœ žœ˜#—Kšœ˜šžœžœž˜šžœ/žœ ž˜CJšœ žœ˜——Jšœ*˜*—Jšœ˜—J˜Jšžœžœ ˜)J˜Jšœ9˜9J˜Jšžœ˜J˜J˜—…— H`