<<-- TiogaRefreshImpl.mesa Edited by Paxton on June 14, 1983 3:41 pm>> <> 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.