<> <> <> <> DIRECTORY IFSFile USING [AccessFailure, Buffer, Completer, CompleterArg, Position], Leaf USING [FileAddress, Handle, LeafType, OpSpecificFileAddress], PupDefs USING [PupAddress], Rope USING [ROPE], Sequin USING [Buffer, Handle]; IFSFilePrivate: DEFINITIONS = BEGIN OPEN IFSFile, Rope; <> FSObject: TYPE = MONITORED RECORD [ primaryName, primaryPassword: ROPE _ NIL, secondaryName, secondaryPassword: ROPE _ NIL, serverAddr: PupDefs.PupAddress, fileList: FileHandle _ NIL, changeInOpenState: CONDITION _ [timeout: 0], cachedSequin: Sequin.Handle _ NIL, haveSequin: BOOL _ FALSE]; FSInstance: TYPE = REF FSObject; FileObject: TYPE = MONITORED RECORD [ sequin: Sequin.Handle _ NIL, ioPending: IORequest _ NIL, ioSynch: CONDITION _ [timeout: 0], length: Position _ NULL, openCount: [0..128) _ 1, locked: BOOL _ FALSE, seal: FileSeal _ underwaySeal, state: FileState _ alive, link: FileHandle, leafHandle: Leaf.Handle _ NULL, name: ROPE, fs: FSInstance, watcher: PROCESS RETURNS [BOOL] _ NULL]; FileHandle: TYPE = REF FileObject; FileState: TYPE = {alive, flush, closing, closed}; FileSeal: TYPE = MACHINE DEPENDENT { underwaySeal (22B), openSeal (41B), closedSeal (55B), (77B)}; IORequestBlock: TYPE = RECORD [ link: IORequest _ NIL, buffer: Buffer, address: Leaf.FileAddress, op: Leaf.LeafType, bytesToGo: CARDINAL, proc: Completer _ NULL, arg: CompleterArg _ NULL]; IORequest: TYPE = REF IORequestBlock; IFSTimes: TYPE = MACHINE DEPENDENT RECORD [create, write, read: IFSTIME]; IFSTIME: TYPE = MACHINE DEPENDENT RECORD [high, low: CARDINAL]; fileTimeAddress: Leaf.FileAddress = [high: 3777B, low: 174000B]; <> fileLockTimeout: CARDINAL = 2*60; connectionTimeout: CARDINAL = 10*60; <> GetSequinForFS: PROC [fs: FSInstance] RETURNS [sequin: Sequin.Handle, fromCache: BOOL]; <> FreeSequinForFS: PROC [ fs: FSInstance, sequin: Sequin.Handle, toCache: BOOL _ TRUE]; <> InsertFile: PROC [fs: FSInstance, name: ROPE, openProc: PROC [FileHandle] RETURNS [IFSFile.AccessFailure]] RETURNS [FileHandle]; <> ReleaseFile: PROC [file: FileHandle, closeProc: PROC [FileHandle]]; <> PurgeFile: PROC [file: FileHandle, destroyProc: PROC [FileHandle]]; <> ValidateFile: PROC [file: FileHandle]; <> DoRead: PROC [file: FileHandle, request: IORequest]; <> DoWrite: PROC [file: FileHandle, request: IORequest]; <> FileWatcher: PROC [file: FileHandle] RETURNS [BOOL]; <> <> InitializeFreeList: PROC; FinalizeFreeList: PROC; GetIORequestBlock: PROC RETURNS [IORequest]; FreeIORequestBlock: PROC [request: IORequest]; <> AddRopeToBuffer: PROC [buffer: Sequin.Buffer, r: ROPE] RETURNS [Sequin.Buffer]; FileAddressToPosition: PROC [fa: Leaf.FileAddress] RETURNS [Position]; PositionToFileAddress: PROC [pos: Position, opSpecific: Leaf.OpSpecificFileAddress _ [read[]]] RETURNS [Leaf.FileAddress]; END.