<> <> <> <> <> <> DIRECTORY Rope USING [ROPE], TEditDocument USING [TEditDocumentData], TextNode USING [Ref]; TEditLocks: CEDAR DEFINITIONS = BEGIN LockRef: TYPE = REF LockRecord; LockRecord: TYPE = MONITORED RECORD [ waitingForWrite: INTEGER _ 0, -- number of processes waiting for write access count, maxCount: [0..255] _ 0, -- number of times have entered this lock process: PROCESS _ NIL, -- the unique process which has write access to this document whoLast, whoFirst: Rope.ROPE, -- provided by the lockers unlocked: CONDITION -- raised when the lock is freed ]; Access: TYPE = { read, write }; Lock: PROC [doc: TextNode.Ref, who: Rope.ROPE, access: Access _ write] RETURNS [LockRef]; <> <<(1) it is unlocked, or>> <<(2) current process has a write lock on it already>> <> <> <> <> LockBoth: PROC [doc1, doc2: TextNode.Ref, who: Rope.ROPE, access1, access2: Access _ write] RETURNS [lock1, lock2: LockRef]; <> <<>> LockOrder: PROC [doc1, doc2: TextNode.Ref] RETURNS [BOOL]; <> Unlock: PROC [doc: TextNode.Ref]; <> LockDocAndTdd: PROC [tdd: TEditDocument.TEditDocumentData, who: Rope.ROPE, access: Access _ write, interrupt, defer: BOOL _ FALSE] RETURNS [LockRef]; <> <> UnlockDocAndTdd: PROC [tdd: TEditDocument.TEditDocumentData]; WaitingForWrite: PROC [lock: LockRef] RETURNS [BOOL]; <> END.