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. YggTransContextImpl.mesa Copyright Σ 1988 by Xerox Corporation. All rights reserved. Bob Hagmann May 3, 1988 2:15:46 pm PDT Exported procedures Public error. Clean up local state and then allow signal to propagate. n.b. this does the right thing only for ERRORs, not SIGNALs. ΚL˜Icodešœ™šœ<™