<> <> <> <> <> <<>> <> <<>> <> DIRECTORY YggEnvironment USING[DID, LockMode, PageCount], YggInternal USING[Document, TransHandle], YggOpenDoc, YggOpenDocPrivate, YggDID USING[DID, EqualDIDs], YggDIDMap USING[GetDID, Register], YggTransactionMap USING[GetOpenDocList, SetOpenDocList]; YggOpenDocImpl: CEDAR MONITOR IMPORTS YggDID, YggDIDMap, YggTransactionMap EXPORTS YggInternal = BEGIN OpenDoc: TYPE = REF OpenDocRep; OpenDocRep: PUBLIC TYPE = YggOpenDocPrivate.OpenDocRep; <> InUse: --CALLING-- ERROR = CODE; OldHandleNotFound: --CALLING-- ERROR = CODE; UseCountAlreadyZero: --CALLING-- ERROR = CODE; <> GetOpenDoc: PUBLIC ENTRY PROCEDURE [trans: YggInternal.TransHandle, did: YggDID.DID] RETURNS [openDoc: OpenDoc] = BEGIN -- errors defined in YggOpenDoc: none. ENABLE UNWIND => NULL; firstOpenDoc: OpenDoc; TRUSTED BEGIN firstOpenDoc _ YggTransactionMap.GetOpenDocList[trans]; END; FOR openDoc _ firstOpenDoc, openDoc.nextForTrans UNTIL openDoc = NIL DO IF YggDID.EqualDIDs[did, GetDID[openDoc]] THEN GOTO found; REPEAT found => openDoc.useCount _ openDoc.useCount + 1; FINISHED => BEGIN openDoc _ NEW[OpenDocRep _ [trans: trans, docHandle: YggDIDMap.Register[did], useCount: 1, deltaVersion: 0, highWaterMark: LAST[YggEnvironment.PageCount], lockMode: none, nextForTrans: firstOpenDoc]]; YggTransactionMap.SetOpenDocList[trans, openDoc]; END; ENDLOOP; END; <> FlushTransState: PUBLIC ENTRY PROCEDURE [trans: YggInternal.TransHandle] = TRUSTED BEGIN -- errors defined in YggOpenDoc: none. ENABLE UNWIND => NULL; FOR openDoc: OpenDoc _ YggTransactionMap.GetOpenDocList[trans], openDoc.nextForTrans UNTIL openDoc = NIL DO IF ((openDoc.useCount # 0) OR (openDoc.deltaVersion = 0)) THEN RETURN WITH ERROR InUse; ENDLOOP; YggTransactionMap.SetOpenDocList[trans, NIL]; END; <> GetDocHandle: PUBLIC PROCEDURE [openDoc: OpenDoc] RETURNS [doc: YggInternal.Document] = BEGIN -- errors defined in YggOpenDoc: none. RETURN[openDoc.docHandle]; END; GetTransHandle: PUBLIC PROCEDURE [openDoc: OpenDoc] RETURNS [trans: YggInternal.TransHandle] = BEGIN -- errors defined in YggOpenDoc: none. RETURN[openDoc.trans]; END; GetDID: PUBLIC PROCEDURE [openDoc: OpenDoc] RETURNS [did: YggEnvironment.DID] = BEGIN -- errors defined in YggOpenDoc: none. RETURN[YggDIDMap.GetDID[openDoc.docHandle]]; END; GetLockMode: PUBLIC ENTRY PROCEDURE [openDoc: OpenDoc] RETURNS [lock: YggEnvironment.LockMode] = BEGIN -- errors defined in YggOpenDoc: none. ENABLE UNWIND => NULL; RETURN[openDoc.lockMode]; END; SetLockMode: PUBLIC ENTRY PROCEDURE [openDoc: OpenDoc, lock: YggEnvironment.LockMode] = BEGIN -- errors defined in YggOpenDoc: none. ENABLE UNWIND => NULL; openDoc.lockMode _ lock; END; <> <> <> <> GetNextHandleForTrans: PUBLIC ENTRY PROCEDURE [trans: YggInternal.TransHandle, lastOpenDoc: OpenDoc _ NIL] RETURNS [nextOpenDoc: OpenDoc] = BEGIN -- errors defined in YggOpenDoc: none. ENABLE UNWIND => NULL; firstOpenDoc: OpenDoc; TRUSTED BEGIN firstOpenDoc _ YggTransactionMap.GetOpenDocList[trans]; END; IF lastOpenDoc = NIL THEN RETURN[firstOpenDoc]; [] _ FindOpenDoc[lastOpenDoc.docHandle, firstOpenDoc]; RETURN[lastOpenDoc.nextForTrans]; END; FindOpenDoc: INTERNAL PROCEDURE [doc: YggInternal.Document, firstDoc: OpenDoc] RETURNS [foundDoc: OpenDoc] = { <> did: YggDID.DID; did _ YggDIDMap.GetDID[doc]; FOR foundDoc _ firstDoc, foundDoc.nextForTrans UNTIL foundDoc = NIL DO IF YggDID.EqualDIDs[did, GetDID[foundDoc]] THEN RETURN; REPEAT FINISHED => ERROR OldHandleNotFound; ENDLOOP; }; <
> END. Edit Log Initial: Kolling: October 21, 1982 2:22 pm: an impl module for YggOpenDoc. <> <> <<>>