-- Copyright (C) 1981, 1984 by Xerox Corporation. All rights reserved.
-- IFSFilePrivate.mesa, HGM, 15-Sep-85 9:12:01
-- Last edited by Levin: 27-Feb-81 15:06:07
DIRECTORY
FileDefs USING [
Buffer, Completer, CompleterArg, defaultTime, FileTime, PageNumber, Position],
Leaf USING [FileAddress, Handle, LeafType, OpSpecificFileAddress],
PupDefs USING [PupAddress],
Sequin USING [Buffer, Handle],
VMDefs USING [AccessFailure, OpenOptions];
IFSFilePrivate: DEFINITIONS =
BEGIN OPEN FileDefs;
-- Types and Related Constants --
FSObject: TYPE = MONITORED RECORD [
primaryName, primaryPassword: LONG STRING,
secondaryName, secondaryPassword: LONG STRING,
serverAddr: PupDefs.PupAddress,
fileList: FileHandle ← NIL,
changeInOpenState: CONDITION ← [timeout: 0]];
FSInstance: TYPE = LONG POINTER TO FSObject;
FileObject: TYPE = MONITORED RECORD [
sequin: Sequin.Handle ← NULL,
ioPending: IORequest ← NIL,
ioSynch: CONDITION ← [timeout: 0],
length: Position ← NULL,
openCount: [0..128) ← 1,
locked: BOOLEAN ← FALSE,
seal: FileSeal ← underwaySeal,
state: FileState ← alive,
link: FileHandle,
leafHandle: Leaf.Handle ← NULL,
name: LONG STRING,
fs: FSInstance,
watcher: PROCESS RETURNS [BOOLEAN] ← NULL];
FileHandle: TYPE = LONG POINTER TO FileObject;
FileState: TYPE = {alive, flush, closing, closed};
FileSeal: TYPE = [0..77B];
openSeal: FileSeal = 41B;
underwaySeal: FileSeal = 22B;
closedSeal: FileSeal = 55B;
IORequestBlock: TYPE = RECORD [
link: IORequest ← NULL,
buffer: Buffer,
address: Leaf.FileAddress,
op: Leaf.LeafType,
bytesToGo: [0..512],
proc: Completer ← NULL,
arg: CompleterArg ← NULL];
IORequest: TYPE = LONG POINTER TO 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];
-- Procedures for the Operations level --
Open: PROCEDURE [
instance: FSInstance, name: LONG STRING, options: VMDefs.OpenOptions ← oldReadOnly]
RETURNS [FileHandle];
Close: PROCEDURE [FileHandle];
Abandon: PROCEDURE [FileHandle];
Destroy: PROCEDURE [file: FileHandle];
GetLength: PROCEDURE [file: FileHandle] RETURNS [Position];
SetLength: PROCEDURE [file: FileHandle, length: Position];
Extend: PROCEDURE [file: FileHandle, length: Position, buffer: LONG POINTER];
Truncate: PROCEDURE [file: FileHandle, length: Position];
StartRead: PROCEDURE [
file: FileHandle, page: PageNumber, buffer: Buffer, callback: Completer,
arg: CompleterArg];
StartWrite: PROCEDURE [
file: FileHandle, page: PageNumber, buffer: Buffer, callback: Completer,
arg: CompleterArg];
GetTimes: PROCEDURE [file: FileHandle] RETURNS [read, write, create: FileTime];
SetCreationTime: PROCEDURE [file: FileHandle, create: FileTime ← defaultTime];
-- Other File Manipulation Procedures --
InsertFile: PROCEDURE [
fs: FSInstance, name: LONG STRING,
openProc: PROCEDURE [FileHandle] RETURNS [VMDefs.AccessFailure]]
RETURNS [FileHandle];
-- The file 'name' is checked against files presently open under file system
-- 'fs'. If the file is not already open, 'openProc' is called. If 'openProc'
-- returns an AccessFailure other than 'ok', the open is considered to have
-- failed, otherwise, the use count of the file handle is incremented.
ReleaseFile: PROCEDURE [file: FileHandle, closeProc: PROCEDURE [FileHandle]];
-- The use count on the indicated file is decremented and, if zero, 'closeProc'
-- is called. The FileHandle then becomes invalid. If the use count is still
-- greater than zero, closeProc is not called and the FileHandle remains usable.
PurgeFile: PROCEDURE [file: FileHandle, destroyProc: PROCEDURE [FileHandle]];
-- The use count on the indicated file must be zero, otherwise an error occurs.
-- 'destroyProc' is called and it is expected to remove all traces of the file.
ValidateFile: PROCEDURE [file: FileHandle];
-- I/O --
DoRead: PROCEDURE [file: FileHandle, request: IORequest];
-- initiates a read operation as described by 'file' and 'request'.
DoWrite: PROCEDURE [file: FileHandle, request: IORequest];
-- initiates a write operation as described by 'file' and 'request'.
FileWatcher: PROCEDURE [file: FileHandle] RETURNS [BOOLEAN];
-- handles responses from the server to operations requested by StartRead,
-- StartWrite, and Extend. The return value indicates whether the file operations
-- were shut down normally or abnormally.
-- FreeList Management --
InitializeFreeList: PROCEDURE;
FinalizeFreeList: PROCEDURE;
GetIORequestBlock: PROCEDURE RETURNS [IORequest];
FreeIORequestBlock: PROCEDURE [request: IORequest];
-- Miscellaneous Utilities --
CopyString: PROCEDURE [s: LONG STRING] RETURNS [ns: LONG STRING];
AddStringToBuffer: PROCEDURE [buffer: LONG POINTER TO Sequin.Buffer, s: LONG STRING];
FileAddressToPosition: PROCEDURE [fa: Leaf.FileAddress]
RETURNS [FileDefs.Position];
PositionToFileAddress: PROCEDURE [
pos: FileDefs.Position, opSpecific: Leaf.OpSpecificFileAddress ← [read[]]]
RETURNS [Leaf.FileAddress];
-- Statistics Logging --
ifsFiles: CARDINAL;
-- count of number of open files at any IFS server.
END.