<<>> <> <> <> <> <> <> DIRECTORY Rope USING [ROPE], TEditDocument USING [TEditDocumentData], Tioga USING [Node]; 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: Tioga.Node, 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: Tioga.Node, who: Rope.ROPE, access1, access2: Access ¬ write] RETURNS [lock1, lock2: LockRef]; <> <<>> LockOrder: PROC [doc1, doc2: Tioga.Node] RETURNS [BOOL]; <> Unlock: PROC [doc: Tioga.Node]; <> 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.