<<-- TEditSelectionLocksImpl.mesa Edited by Paxton on December 28, 1982 2:25 pm>> <> DIRECTORY Process USING [GetCurrent], Rope USING [ROPE], TEditSelection, TEditDocument USING [SelectionId], TEditLocks USING [Unlock], TextNode USING [Ref]; TEditSelectionLocksImpl: CEDAR MONITOR IMPORTS Process, TEditLocks EXPORTS TEditSelection = BEGIN OPEN TEditSelection; LockRec: TYPE = RECORD [ process: PROCESS _ NIL, -- the process holding the lock whoLast, whoFirst: Rope.ROPE, -- the last lockers count, maxCount: [0..255] _ 0 -- number of times inside the lock ]; LockRef: TYPE = REF LockRec; pSelLock: LockRef _ NEW[LockRec]; sSelLock: LockRef _ NEW[LockRec]; fSelLock: LockRef _ NEW[LockRec]; unlocked: CONDITION; UnlockDocAndPSel: PUBLIC PROC [root: TextNode.Ref] = { TEditLocks.Unlock[root]; UnlockSel[primary] }; LockBothSelections: PUBLIC PROC [who: Rope.ROPE] = { LockSel[primary, who]; LockSel[secondary, who] }; UnlockBothSelections: PUBLIC PROC = { UnlockSel[primary]; UnlockSel[secondary] }; LockSel: PUBLIC ENTRY PROC [selection: TEditDocument.SelectionId, who: Rope.ROPE] = { <> ENABLE UNWIND => NULL; myProcess: PROCESS; lock: LockRef = SELECT selection FROM primary => pSelLock, secondary => sSelLock, feedback => fSelLock, ENDCASE => ERROR; TRUSTED {myProcess _ LOOPHOLE[Process.GetCurrent[]]}; IF myProcess#lock.process THEN BEGIN WHILE lock.count>0 DO WAIT unlocked; ENDLOOP; lock.process _ myProcess; END; IF lock.count=0 THEN lock.whoFirst _ who ELSE lock.whoLast _ who; lock.count _ lock.count+1; lock.maxCount _ MAX[lock.maxCount, lock.count]; }; UnlockSel: PUBLIC ENTRY PROC [selection: TEditDocument.SelectionId _ primary] = { <> ENABLE UNWIND => NULL; lock: LockRef = SELECT selection FROM primary => pSelLock, secondary => sSelLock, feedback => fSelLock, ENDCASE => ERROR; TRUSTED {IF lock.process # Process.GetCurrent[] THEN ERROR}; IF (lock.count _ lock.count-1) > 0 THEN RETURN; lock.whoLast _ lock.whoFirst _ NIL; lock.maxCount _ 0; BROADCAST unlocked }; <<>> END...