-- Segments.mesa Edited by Sandman on October 2, 1980 9:04 AM DIRECTORY AltoDefs USING [PageCount, PageNumber], AltoFileDefs USING [FP, NullFP], DirectoryDefs USING [EnumerateDirectory], InlineDefs USING [LongDivMod, LongMult], SegmentDefs USING [ AllocInfo, AccessOptions, DefaultAccess, DefaultANYBase, DefaultBase, DefaultMDSBase, DefaultVersion, DefaultXMBase, DeleteFileSegment, DestroyFile, EasyDown, EasyUp, EnumerateFiles, EnumerateFileSegments, FileError, FileHandle, FileNameError, FileSegmentHandle, GetEndOfFile, GetFileTimes, HardDown, HardUp, InsertFile, InsufficientVM, InvalidFP, LockFile, MakeSwappedIn, MoveFileSegment, NewFile, NewFileSegment, NewFileOnly, OldFileOnly, Read, ReadWrite, ReadWriteAppend, ReleaseFile, SegmentAddress, SetEndOfFile, SetFileTimes, SwapError, SwapOut, SwapUp, Unlock, UnlockFile, VersionOptions, VMtoFileSegment, WriteAppend], Time USING [Packed]; Segments: DEFINITIONS IMPORTS DirectoryDefs, InlineDefs, SegmentDefs = BEGIN Address: TYPE = POINTER; FP: TYPE = AltoFileDefs.FP; FPHandle: TYPE = POINTER TO FP; FHandle: TYPE = PRIVATE SegmentDefs.FileHandle; SHandle: TYPE = PRIVATE SegmentDefs.FileSegmentHandle; -- Assert: The word POINTER does not appear below here. PageCount: TYPE = AltoDefs.PageCount; PageNumber: TYPE = AltoDefs.PageNumber; NullFP: FP = AltoFileDefs.NullFP; -- S E G M E N T S AllocInfo: TYPE = PRIVATE SegmentDefs.AllocInfo; EasyUp: AllocInfo = SegmentDefs.EasyUp; EasyDown: AllocInfo = SegmentDefs.EasyDown; HardUp: AllocInfo = SegmentDefs.HardUp; HardDown: AllocInfo = SegmentDefs.HardDown; DefaultBase: PageNumber = SegmentDefs.DefaultBase; DefaultMDSBase: PageNumber = SegmentDefs.DefaultMDSBase; DefaultXMBase: PageNumber = SegmentDefs.DefaultXMBase; DefaultANYBase: PageNumber = SegmentDefs.DefaultANYBase; SwapProblem: PROC RETURNS [SIGNAL [seg: SHandle]] = INLINE { RETURN[SegmentDefs.SwapError]}; OutOfMemory: PROC RETURNS [SIGNAL [x: CARDINAL]] = INLINE { RETURN[LOOPHOLE[SegmentDefs.InsufficientVM]]}; DeleteSegment: PROCEDURE [seg: SHandle] = INLINE { SegmentDefs.DeleteFileSegment[seg]}; EnumerateSegments: PROCEDURE [proc: PROCEDURE [SHandle] RETURNS [BOOLEAN]] RETURNS [SHandle] = INLINE {RETURN[SegmentDefs.EnumerateFileSegments[proc]]}; FlushSegmentCache: PROCEDURE; Kill: PROCEDURE [seg: SHandle, base: PageNumber ← DefaultBase]; MakeReadOnly: PROCEDURE [seg: SHandle]; MoveSegment: PROCEDURE [seg: SHandle, base: PageNumber, pages: PageCount] = INLINE {SegmentDefs.MoveFileSegment[seg, base, pages]}; NewSegment: PROCEDURE [ file: FHandle, base: PageNumber, pages: PageCount, access: Access ← DefaultAccess] RETURNS [SHandle] = INLINE { RETURN[SegmentDefs.NewFileSegment[file, base, pages, access]]}; SegmentAddress: PROCEDURE [seg: SHandle] RETURNS [Address] = INLINE { RETURN[SegmentDefs.SegmentAddress[seg]]}; SwapIn: PROCEDURE [ seg: SHandle, base: PageNumber ← DefaultBase, info: AllocInfo ← EasyUp] = INLINE {SegmentDefs.MakeSwappedIn[seg, base, info]}; SwapOut: PROCEDURE [seg: SHandle] = INLINE {SegmentDefs.SwapOut[seg]}; SwapUp: PROCEDURE [seg: SHandle] = INLINE {SegmentDefs.SwapUp[seg]}; Unlock: PROCEDURE [seg: SHandle] = INLINE {SegmentDefs.Unlock[seg]}; VMtoSegment: PROCEDURE [a: Address] RETURNS [SHandle] = INLINE { RETURN[SegmentDefs.VMtoFileSegment[a]]}; FileFromSegment: PROC [seg: SHandle] RETURNS [FHandle] = INLINE { RETURN[seg.file]}; BaseFromSegment: PROC [seg: SHandle] RETURNS [PageNumber] = INLINE { RETURN[seg.base]}; IsSwappedIn: PROC [seg: SHandle] RETURNS [BOOLEAN] = INLINE { RETURN[seg.swappedin]}; PagesFromSegment: PROC [seg: SHandle] RETURNS [PageCount] = INLINE { RETURN[seg.pages]}; LockFromSegment: PROC [seg: SHandle] RETURNS [CARDINAL] = INLINE { RETURN[seg.lock]}; UpdateUsageHint: PROC [seg: SHandle] = INLINE {seg.inuse ← TRUE}; -- F I L E S: VersionOptions: TYPE = PRIVATE SegmentDefs.VersionOptions; DefaultVersion: VersionOptions = SegmentDefs.DefaultVersion; NewFileOnly: VersionOptions = SegmentDefs.NewFileOnly; OldFileOnly: VersionOptions = SegmentDefs.OldFileOnly; Access: TYPE = PRIVATE SegmentDefs.AccessOptions; AllAccess: Access = SegmentDefs.ReadWriteAppend; DefaultAccess: Access = SegmentDefs.DefaultAccess; Read: Access = SegmentDefs.Read; ReadWrite: Access = SegmentDefs.ReadWrite; Write: Access = SegmentDefs.WriteAppend; FileNameProblem: PROCEDURE RETURNS [SIGNAL [name: STRING]] = INLINE { RETURN[SegmentDefs.FileNameError]}; FileProblem: PROCEDURE RETURNS [SIGNAL [f: FHandle]] = INLINE { RETURN[SegmentDefs.FileError]}; FileUnknown: PROCEDURE RETURNS [SIGNAL] = INLINE { RETURN[LOOPHOLE[SegmentDefs.InvalidFP]]}; DestroyFile: PROCEDURE [file: FHandle] = INLINE {SegmentDefs.DestroyFile[file]}; EnumerateFiles: PROCEDURE [proc: PROCEDURE [FHandle] RETURNS [BOOLEAN]] RETURNS [file: FHandle] = INLINE {RETURN[SegmentDefs.EnumerateFiles[proc]]}; FPFromFile: PROCEDURE [file: FHandle, fp: FPHandle] = INLINE {fp↑ ← file.fp}; GetFileProperties: PROCEDURE [file: FHandle] RETURNS [create, write, read: Time.Packed, length: LONG CARDINAL] = INLINE { [create: create, write: write, read: read] ← GetFileTimes[file]; length ← GetFileLength[file]}; GetFileTimes: PROCEDURE [file: FHandle] RETURNS [create, write, read: Time.Packed] = INLINE { [create: create, write: write, read: read] ← SegmentDefs.GetFileTimes[file]}; GetFileLength: PROCEDURE [file: FHandle] RETURNS [LONG CARDINAL] = INLINE { page, byte: CARDINAL; [page: page, byte: byte] ← SegmentDefs.GetEndOfFile[file]; RETURN[InlineDefs.LongMult[page, 512] + byte - 512]}; InsertFile: PROCEDURE [file: FPHandle, access: Access ← DefaultAccess] RETURNS [FHandle] = INLINE {RETURN[SegmentDefs.InsertFile[file, access]]}; LockFile: PROCEDURE [file: FHandle] = INLINE {SegmentDefs.LockFile[file]}; NewFile: PROCEDURE [ name: STRING, access: Access ← DefaultAccess, version: VersionOptions ← DefaultVersion] RETURNS [FHandle] = INLINE { RETURN[SegmentDefs.NewFile[name, access, version]]}; ReleasableFile: PROCEDURE [file: FHandle] RETURNS [BOOLEAN] = INLINE { RETURN[file.segcount = 0 AND file.lock = 0]}; ReleaseFile: PROCEDURE [file: FHandle] = INLINE {SegmentDefs.ReleaseFile[file]}; SetFileTimes: PROCEDURE [ file: FHandle, create, write, read: Time.Packed ← 0] = INLINE { SegmentDefs.SetFileTimes[ file: file, create: create, write: write, read: read]}; SetFileLength: PROCEDURE [file: FHandle, length: LONG CARDINAL] = INLINE { page, byte: CARDINAL; [quotient: page, remainder: byte] ← InlineDefs.LongDivMod[length, 512]; SegmentDefs.SetEndOfFile[file: file, page: page+1, byte: byte]}; UnlockFile: PROCEDURE [file: FHandle] = INLINE {SegmentDefs.UnlockFile[file]}; -- D I R E C T O R Y: EnumerateDirectory: PROCEDURE [proc: PROCEDURE [FPHandle, STRING] RETURNS [BOOLEAN]] = INLINE {DirectoryDefs.EnumerateDirectory[proc]}; -- for Debugger Only: NameForFile: PROCEDURE [name: STRING, file: FHandle]; ModifyFile: PROCEDURE [name: STRING] RETURNS [BOOLEAN]; AddModifyProc: PROCEDURE [PROCEDURE [STRING, FHandle] RETURNS [BOOLEAN]]; InvalidateFileCache: PROCEDURE; FlushFileCache: PROCEDURE; END.