<> <> <> DIRECTORY YggEnvironment USING [TransID], YggNav USING [Error], YggTransactionMap USING [GetTransHandle, TransHandle, nullTransHandle, StartWork, StopWork], YggTransContext USING [TransactionWork]; YggTransContextImpl: CEDAR MONITOR IMPORTS YggNav, YggTransactionMap EXPORTS YggTransContext = BEGIN <> EstablishTransactionContext: PUBLIC PROCEDURE [transID: YggEnvironment.TransID, work: YggTransContext.TransactionWork] = { trans: YggTransactionMap.TransHandle = YggTransactionMap.GetTransHandle[transID]; IF trans = YggTransactionMap.nullTransHandle OR ~YggTransactionMap.StartWork[trans] THEN ERROR YggNav.Error[[$invalidTrans, "invalid transaction"]]; { ENABLE <> YggNav.Error => YggTransactionMap.StopWork[trans]; { -- extra nesting so errors raised from EXITS clause are caught by the ENABLE work[trans: trans ]; }; }; YggTransactionMap.StopWork[trans]; }; END.