-- File: CedarSnapshot.mesa -- last edited by Levin: June 1, 1982 9:17 am DIRECTORY Space USING [Handle], Volume USING [ID, nullID]; CedarSnapshot: DEFINITIONS = BEGIN Outcome: TYPE = { checkpointed, potentiallyDangerousCodeLinks, insufficientDiskSpace, transactionsInProgress, rolledBack, overwrittenBcd}; CheckpointOutcome: TYPE = Outcome[checkpointed..transactionsInProgress]; RollbackOutcome: TYPE = Outcome[rolledBack..overwrittenBcd]; RiskyCheckpoint: TYPE = Outcome[potentiallyDangerousCodeLinks..potentiallyDangerousCodeLinks]; FailedCheckPoint: TYPE = Outcome[insufficientDiskSpace..transactionsInProgress]; FailedRollback: TYPE = Outcome[overwrittenBcd..overwrittenBcd]; Checkpoint: PROCEDURE [volume: Volume.ID ← Volume.nullID] RETURNS [outcome: Outcome]; -- Checkpoint saves the volatile virtual memory state (i.e., all virtual memory -- spaces backed by anonymous secondary storage). In addition, it invokes -- each registered CheckpointProc once, giving it the opportunity to request that -- other parts of virtual memory (i.e. parts backed by named secondary storage) -- be saved as well (see the description of Register, below). If sufficient -- disk space is available, Checkpoint returns Outcome[checkpointed], -- otherwise, it returns Outcome[insufficientDiskSpace]. When Rollback (see below) -- is invoked, the saved state is restored, causing the program to appear to be -- inside Checkpoint again. However, this time, it will return Outcome[rolledBack]. -- Checkpoint guarantees that the anonymous memory state, as well as the state of any -- registered spaces, is preserved; however, changes in named files on disk that -- are mapped to virtual memory at the time of the Checkpoint may cause unexpected -- behavior at Rollback time. (The most likely symptoms are File.Unknown or -- address faults when such areas of virtual memory are touched after Rollback.) -- Checkpoint saves all state information in a file on the argument volume; if -- the parameter is defaulted, the system volume is used. This checkpoint file is -- automatically deleted when the volume on which it resides is booted. RollBack: PROCEDURE [volume: Volume.ID ← Volume.nullID]; -- A call on this procedure normally causes the invoking environment to disappear. -- The state previously saved by Checkpoint on the argument volume is restored -- (see above), and control is transferred to it. (If volume is defaulted, the -- system volume is used.) If no checkpointed state can be found, Rollback simply -- returns to its caller. After the rollback is completed, each registered -- RollbackProc (see Register, below) is invoked once. Delete: PROCEDURE [volume: Volume.ID ← Volume.nullID]; -- This procedure causes the checkpointed state stored on the argument volume -- (if defaulted, the system volume) to be deleted. A subsequent Rollback will -- have no effect. This procedure has no effect on the registered CheckpointProcs -- and RollbackProcs. CheckpointProc: TYPE = PROCEDURE [AddSpaceProc]; RollbackProc: TYPE = PROCEDURE [After]; AddSpaceProc: TYPE = PROCEDURE [Space.Handle]; After: TYPE = {checkpoint, rollback}; Register: PROCEDURE [c: CheckpointProc ← NIL, r: RollbackProc ← NIL]; -- Clients of this interface may register procedures with the checkpoint mechanism -- at any time prior to the invocation of Checkpoint. Checkpoint invokes each -- registered CheckpointProc once before constructing the checkpoint and passes -- an AddSpaceProc to be used to tell the checkpoint mechanism what space or spaces -- are to be included in the saved state. Each mapped portion of such a space must -- be backed by a named file (i.e., its backing storage must not have been acquired -- by mapping to Space.defaultWindow). Although the entire space need not be mapped, -- any mapped subspace must be writable. The AddSpaceProc may be invoked only from -- within the CheckpointProc invoked by Checkpoint. Checkpoint procs are invoked -- in the opposite order in which they were registered, i.e., the most recently -- registered procedure is invoked first and the least recently registered one is -- invoked last. RollbackProcs are invoked after a checkpoint (even if the -- checkpoint was unsuccessful) and after a RollBack. In both cases, they are -- executed in the order in which they were registered, i.e. the least recently -- registered procedure is executed first and the most recently registered one is -- executed last. Deregister: PROCEDURE [c: CheckpointProc ← NIL, r: RollbackProc ← NIL]; -- A client may use this procedure to cancel a previously registered CheckpointProc -- and/or RollbackProc. END.