-- TransactionMap.mesa -- TransID -> TransactionMap.Handle, and public operations on TransactionMap.Handle. -- Last edited by -- Taft on 16-Feb-82 17:22:37 -- MBrown on January 24, 1983 2:23 pm -- Kolling on November 2, 1983 12:45 pm DIRECTORY AlpineEnvironment, AlpineInternal, BasicTime; TransactionMap: DEFINITIONS = BEGIN Conversation: TYPE = AlpineEnvironment.Conversation; TransID: TYPE = AlpineEnvironment.TransID; FileInstanceHandle: TYPE = AlpineInternal.FileInstanceHandle; Handle: TYPE = AlpineInternal.TransHandle; nullHandle: Handle = NIL; -- Creating, finding, and deleting Handles Register: PROC [self: Handle] RETURNS [alreadyRegistered: BOOL]; -- If a transaction object with TransID self.transID exists in the map, return --alreadyRegistered = TRUE. Otherwise insert self into the map and return --alreadyRegistered = FALSE. GetHandle: PROC [transID: TransID] RETURNS [Handle]; -- Returns nullHandle if transID is not registered. Unregister: PROC [self: Handle]; EnumProc: TYPE = PROC [Handle] RETURNS [stop: BOOL]; LockedEnumerate: PROC [proc: EnumProc]; -- proc is called with TransactionMap monitor locked. All Handles Registered --before the start of the enumeration and not Unregistered before the start of the --enumeration will be seen exactly once. UnlockedEnumerate: PROC [proc: EnumProc]; -- proc is called with TransactionMap monitor unlocked. All Handles Registered --before the start of the enumeration and not Unregistered before the end of the --enumeration will be seen at least once. -- Using Handles GetTransID: PROC [self: Handle] RETURNS [TransID]; -- Returns the TransID established by the Register call that generated the Handle. StartWork: PROC [self: Handle, difficulty: AlpineInternal.WorkLevel ← normal] RETURNS [canWork: BOOL]; -- Called during normal operation at start of any operation (CreateFile, WritePages, ...) --for transaction self. Not called by recovery procedures for these operations. -- Called with difficulty = hard if the operation may dirty a cache that is flushed --during transaction prepare by calling through the AlpineFile interface. For instance, --CreateFile dirties the owner database cache in this way. -- If StartWork returns canWork ~ FALSE, then operation must terminate (raising --an error to indicate that the transaction or open file is "unknown"). StopWork: PROC [self: Handle, estimatedUpdateCost: INT]; -- Called at end of any operation (CreateFile, WritePages, ...) for transaction self. --The estimatedUpdateCost parameter is an estimate of the work involved in doing --updates that implement the operation (both immediate and deferred updates). Pass --estimatedUpdateCost = 0 if the operation was readonly. GetTimeOfLastStartWork: PROC [self: Handle] RETURNS [BasicTime.GMT]; -- Returns number of seconds that have elapsed since the last successful call --to StartWork on self. GetEstimatedUpdateCost: PROC [self: Handle] RETURNS [INT]; -- Returns the total of all estimatedUpdateCosts for operations on this transaction. EnableAlpineWheel: PROC [self: Handle, conversation: Conversation, enable: BOOL]; IsAlpineWheel: PROC [self: Handle, conversation: Conversation] RETURNS [enabled: BOOL]; -- If self = AlpineIdentity.myFileStore, then returns TRUE. Otherwise, if there has --been a call to EnableAlpineWheel for this (Handle, Conversation) pair, returns the --value of "enable" passed on the last such call. Otherwise returns FALSE. GetFileInstanceList: PROC [self: Handle] RETURNS [fileInstanceList: FileInstanceHandle]; -- Does not enter self's monitor. SetFileInstanceList: PROC [self: Handle, fileInstanceList: FileInstanceHandle]; -- Does not enter self's monitor. GetLockHeader: PROC [self: Handle] RETURNS [lockHeader: AlpineInternal.LockTransHeaderHandle]; -- Does not enter self's monitor. IsCommitted: PROC [self: Handle] RETURNS [BOOL]; -- Called during normal operation and during recovery. -- Error if self is not active or completing. TransState: TYPE = AlpineInternal.TransState; --{committed, aborted, ready}-- StateDuringRecovery: PROC [self: Handle] RETURNS [TransState]; -- Called during recovery only. -- Returns the state that the transaction will reach at the end of recovery. AbortUnilaterally: PROC [self: Handle, why: AbortReason]; -- Aborts self without any communication with self's coordinator. -- why is for informational purposes only. AbortReason: TYPE = { clientRequest, deadlock, timeout, blockingNewLockRequest, tooManyTransactions, oldUncommittedUpdates }; AssertUpdatesAreComplete: PROC [self: Handle]; -- Asserts that all updates called for by the transaction self have been completed --(if self committed) or have been undone (if self aborted), at the level of the --FilePageMgr interface. These updates may still not be recoverable except from --the log; calling FilePageMgr.ForceOutEverything is guaranteed to make the --updates recoverable. END.