<> <> <> <> <> <> DIRECTORY YggEnvironment, YggLog; YggLogControl: CEDAR DEFINITIONS = BEGIN FileStore: TYPE = YggEnvironment.FileStore; TransID: TYPE = YggEnvironment.TransID; PageCount: TYPE = YggEnvironment.PageCount; RecordID: TYPE = YggLog.RecordID; RecordType: TYPE = YggLog.RecordType; <> <> <> <> <> <> <> <> Format: PROC []; <> <> <> <> Recover: PROC []; <> <> <> DiscoverWhereToStartAnalysisPass: PROC [errorOnBadCheckpoint: BOOL] RETURNS [ ok: BOOL, checkpointWord: YggEnvironment.WordNumber, checkpointRecord, startAnalysisRecord: RecordID]; <> AnalysisProc: TYPE = PROC [record: RecordID, type: RecordType, trans: TransID]; <> <> <> RegisterAnalysisProc: PROC [recordType: RecordType, analysisProc: AnalysisProc]; ForkCheckpointProcess: PROC [wakeupPeriodInSeconds: NAT]; <> <> <> <> <<1) calls each subsystem that writes log records. At present the three subsystems>> <> <> <> <<(probably in another process) to reduce its use. The worker subsystem forces all>> <> <> <<2) writes a checkpointComplete log record if some value in this record is different>> <> <<3) initiates an incremental garbage collection in order to keep zones compact.>> <<(it makes sense to do this in the checkpoint process since step 1 often frees storage).>> CheckpointProc: TYPE = PROC [] RETURNS [keepRecord, startAnalysisRecord: RecordID]; <> <> <> <> <> <> <> <> <> RegisterCheckpointProc: PROC [checkpointProc: CheckpointProc]; WordsUsableByClient: PROC [] RETURNS [words: INT]; <> <> RecordIDOfNextWrite: PROC [] RETURNS [RecordID]; <> <> <> WriteNoopRecords: PROC [nPages: PageCount] RETURNS [followingRecord: RecordID]; <> END.