<> <> <> <> <> <> DIRECTORY AlpineEnvironment, AlpineInternal, FileMap, FilePageMgr, AlpineLog, LogRep, RestartFile; RestartFileImpl: MONITOR IMPORTS FileMap, FilePageMgr EXPORTS RestartFile = BEGIN VolumeID: TYPE = AlpineEnvironment.VolumeID; FileID: TYPE = AlpineEnvironment.FileID; RecordID: TYPE = AlpineLog.RecordID; WordNumber: TYPE = INT; restartFileHandle: FileMap.Handle _ NIL; EstablishRestartFile: PUBLIC ENTRY PROC [volume: VolumeID, restartFile: FileID] = { restartFileHandle _ FileMap.Register[volumeID: volume, fileID: restartFile]; IF FilePageMgr.GetSize[restartFileHandle] # 1 THEN ERROR; }; ReadRestartRecord: PUBLIC ENTRY PROC [] RETURNS [ wordNumberForCheckpointCompleteRecord: WordNumber, recordIDForCheckpointCompleteRecord: RecordID] = { chunk: FilePageMgr.VMPageSet _ FilePageMgr.ReadPages[fileHandle: restartFileHandle, pageRun: [firstPage: 0, count: 1]]; { restartRecord: LONG POINTER TO LogRep.RestartRecord = LOOPHOLE[chunk.pages]; [wordNumberForCheckpointCompleteRecord, recordIDForCheckpointCompleteRecord] _ restartRecord^; }; FilePageMgr.ReleaseVMPageSet[vMPageSet: chunk, releaseState: clean, keep: FALSE]; }; WriteRestartRecord: PUBLIC ENTRY PROC [ wordNumberForCheckpointCompleteRecord: WordNumber, recordIDForCheckpointCompleteRecord: RecordID] = { chunk: FilePageMgr.VMPageSet _ FilePageMgr.UsePages[fileHandle: restartFileHandle, pageRun: [firstPage: 0, count: 1]]; { restartRecord: LONG POINTER TO LogRep.RestartRecord = LOOPHOLE[chunk.pages]; restartRecord^ _ [wordNumberForCheckpointCompleteRecord, recordIDForCheckpointCompleteRecord]; }; FilePageMgr.ReleaseVMPageSet[ vMPageSet: chunk, releaseState: writeIndividualWait, keep: FALSE]; }; END. CHANGE LOG Created by MBrown on September 23, 1982 1:41 pm Changed by MBrown on October 10, 1982 9:44 pm <> Changed by MBrown on October 14, 1982 2:40 pm <> <> <> <> <> <> <<>>