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