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... ΰ-- TEditSelectionLocksImpl.mesa Edited by Paxton on December 28, 1982 2:25 pm Last Edited by: Maxwell, January 6, 1983 11:57 am lock the selection so that no other process can change it give up lock on the selection ΚΕ˜JšΟcM™MJšΟk1™1Jšž ˜ Jšœžœ˜Jšœžœžœ˜Jšœ˜Jšœžœ˜"Jšœ žœ ˜Jšœ žœ˜J˜Jšœž ˜&J˜Jšžœ˜Jšžœž˜J˜Jšžœ˜J˜šœ žœžœ˜Jšœ žœžœ˜7Jšœžœ˜1Jšœ"˜@J˜—Jšœ žœžœ ˜Jšœžœ ˜!Jšœžœ ˜!Jšœžœ ˜!J˜Jšœ ž œ˜J˜šΟnœžœžœ˜6Jšœ.˜.J˜—šŸœžœžœ žœ˜4Jšœ1˜1J˜—šŸœžœžœ0˜QJ˜—š Ÿœžœžœžœ2žœ˜UJ™9Jšžœžœžœ˜Jšœ ž˜šœžœ ž˜%JšœBžœžœ˜S—Jšžœžœ˜5šžœžœž˜$Jšžœžœžœ žœ˜-Jšœ˜Jšžœ˜—Icodešžœžœžœ˜AJ˜Jšœžœ˜/J˜—J˜šŸ œžœžœžœ5˜QJ™Jšžœžœžœ˜šœžœ ž˜%JšœBžœžœ˜S—Jšžœžœ%žœžœ˜