-- File: AltoFileControl.mesa
-- Last edited by Levin: 27-Feb-81 11:14:20
DIRECTORY
AltoFile USING [],
AltoFilePrivate USING [
Abandon, Close, Destroy, Extend, FileObject, FinalizeDirectory, FinalizeFileList,
FinalizeKD, GetLength, GetTimes, InitializeDirectory, InitializeFileList,
InitializeKD, Open, SetCreationTime, SetLength, Truncate],
FileDefs USING [
Buffer, Completer, CompleterArg, FileHandle, FSInstance, Operations,
OperationsRecord, PageNumber],
FrameDefs USING [IsBound],
LogDefs USING [DisplayNumber],
VMStorage USING [longTerm];
AltoFileControl: MONITOR
IMPORTS AltoFilePrivate, FrameDefs, LogDefs, VMStorage
EXPORTS AltoFile, AltoFilePrivate, FileDefs =
BEGIN OPEN AltoFilePrivate;
-- Global Variables --
loginCount: CARDINAL;
-- Miscellaneous --
InsufficientLogouts: ERROR = CODE;
TooManyLogouts: ERROR = CODE;
UseDiskIODefs: ERROR = CODE;
-- Types Exported to FileDefs --
FileObject: PUBLIC TYPE = AltoFilePrivate.FileObject;
-- Procedures Exported to FileDefs --
InitializeAlto: PUBLIC PROCEDURE RETURNS [FileDefs.Operations] =
BEGIN
loggingEnabled ← FrameDefs.IsBound[LogDefs.DisplayNumber];
altoOps ← VMStorage.longTerm.NEW[FileDefs.OperationsRecord ← [
login: Login,
logout: Logout,
checkpoint: Checkpoint,
abort: Abort,
open: Open,
close: Close,
abandon: Abandon,
destroy: Destroy,
getLength: GetLength,
setLength: SetLength,
extend: Extend,
truncate: Truncate,
startRead: StartRead,
startWrite: StartWrite,
getTimes: GetTimes,
setCreation: SetCreationTime]];
InitializeFileList[];
loginCount ← 0;
RETURN[altoOps]
END;
FinalizeAlto: PUBLIC PROCEDURE =
BEGIN
IF loginCount ~= 0 THEN ERROR InsufficientLogouts;
VMStorage.longTerm.FREE[@altoOps];
FinalizeFileList[];
FinalizeKD[];
END;
-- Variables Exported to AltoFile --
altoOps: PUBLIC FileDefs.Operations;
-- Variables Exported to AltoFilePrivate --
loggingEnabled: PUBLIC BOOLEAN;
-- Internal Procedures --
Login: ENTRY PROCEDURE [server,
userName, password, secondaryName, secondaryPassword: STRING ← NIL]
RETURNS [FileDefs.FSInstance] =
BEGIN
IF loginCount = 0 THEN {InitializeDirectory[]; InitializeKD[]};
loginCount ← loginCount + 1;
RETURN[NIL]
END;
Logout: ENTRY PROCEDURE [fs: FileDefs.FSInstance] =
BEGIN
SELECT loginCount FROM
0 => ERROR TooManyLogouts;
1 => FinalizeDirectory[];
ENDCASE;
loginCount ← loginCount - 1;
END;
Checkpoint: PROCEDURE [fs: FileDefs.FSInstance] = {NULL};
Abort: PROCEDURE [fs: FileDefs.FSInstance] = {NULL};
StartRead, StartWrite: PROCEDURE [
file: FileDefs.FileHandle, page: FileDefs.PageNumber, buffer: FileDefs.Buffer,
callback: FileDefs.Completer, arg: FileDefs.CompleterArg] =
BEGIN
ERROR UseDiskIODefs
END;
END.