<> <> <> <> <> <> <<>> <> DIRECTORY BasicTime USING[GMT, nullGMT], Camelot USING[ListOfSegmentDesc, optrT, tidT], Mach USING[ListOfPorts], YggDIDMap USING[Run], YggEnvironment USING[PageRun], YggFile USING[FileHandle], YggInternal USING[FileHandle]; YggBuffMan: CEDAR DEFINITIONS = BEGIN VMPageSet: TYPE = LIST OF VMPageItem; VMPageItem: TYPE = RECORD [ buffer: LONG POINTER, pageRun: YggDIDMap.Run, refChunk: PRIVATE REF -- Chunk -- ]; <> nullVMPageSet: VMPageSet = NIL; Chunk: TYPE = RECORD [ useCount: NAT _ 0, lastTouchTime: BasicTime.GMT _ BasicTime.nullGMT, file: YggFile.FileHandle _ NIL, -- informative only run: YggDIDMap.Run, startAddress: LONG POINTER _ NIL, lruListPrev: REF Chunk _ NIL, lruListNext: REF Chunk _ NIL, valid: BOOL _ FALSE ]; < GetSize[fileHandle] except that the ReadAhead procedures just stop and return when PageRunExtendsPastEof is encountered. No proc returns a VMPageSet with count = 0. >> ReadPages: PROCEDURE [fileHandle: YggInternal.FileHandle, tid: Camelot.tidT, pageRun: YggEnvironment.PageRun, zeroFill: BOOL _ FALSE] RETURNS [vMPageSet: VMPageSet]; <> <> ReadAheadPages: PROCEDURE[fileHandle: YggInternal.FileHandle, pageRun: YggEnvironment.PageRun]; <> <> UsePages: PROCEDURE [fileHandle: YggInternal.FileHandle, tid: Camelot.tidT, pageRun: YggEnvironment.PageRun] RETURNS [vMPageSet: VMPageSet]; <> <> ShareVMPageSet: PROCEDURE [vMPageSet: VMPageSet]; <> <> WritePages: PROC [fileHandle: YggInternal.FileHandle, tid: Camelot.tidT, to: INT, nPages: INT, from: LONG POINTER]; <> <> ReleaseVMPageSet: PROCEDURE [vMPageSet: VMPageSet, releaseState: ReleaseState, keep: BOOLEAN]; <> ReleaseState: TYPE = {writeIndividualWait, writeBatchedWait, writeIndividualNoWait, writeBatchedNoWait, clean}; DirtyReleaseState: TYPE = ReleaseState[writeIndividualWait..writeBatchedNoWait]; DirtyWaitReleaseState: TYPE = ReleaseState[writeIndividualWait..writeBatchedWait]; DirtyNoWaitReleaseState: TYPE = ReleaseState[writeIndividualNoWait..writeBatchedNoWait]; <> ForceOutVMPageSet: PROCEDURE [vMPageSet: VMPageSet]; <> <> ForceOutFile: PROCEDURE [fileHandle: YggInternal.FileHandle]; <> <> ForceOutEverything: PROCEDURE; <> <> InitializeFilePageMgr: PROCEDURE[seqDescList: Camelot.ListOfSegmentDesc, seqPortList: Mach.ListOfPorts] RETURNS [firstTime : BOOL ]; <> RestoreCacheToCleanState: PROCEDURE; <> <> <> InsufficientSpaceOnVolume: -- ABSTRACTION -- ERROR; VolumeTooFragmented: -- ABSTRACTION -- ERROR; VolumeWentOffline: -- ABSTRACTION -- ERROR; NoSuchFile: -- CALLING -- ERROR; NoSuchVolume: -- CALLING -- ERROR; PageRunArgIllegal: -- CALLING -- ERROR; PageRunExtendsPastEof: -- CALLING -- ERROR; SizeArgIllegal: -- CALLING -- ERROR; TopLevelTransactionOnly: -- CALLING -- ERROR; <> WriteBytes: PROC [optr: Camelot.optrT, value: LONG POINTER, valueCnt: CARD]; <> END.