-- PilotSegments.mesa Edited by Johnsson on February 3, 1981 4:33 PM DIRECTORY Environment USING [PageCount, PageNumber], File USING [ Capability, delete, grow, nullCapability, Permissions, read, shrink, Unknown, write], Space USING [Handle, InsufficientSpace], Time USING [Packed]; Segments: DEFINITIONS IMPORTS File, Space = BEGIN Address: TYPE = LONG POINTER; FP: TYPE = File.Capability; FPHandle: TYPE = POINTER TO FP; FHandle: TYPE = POINTER TO FObject; SHandle: TYPE = POINTER TO SObject; -- Assert: The word POINTER does not appear below here. PageCount: TYPE = Environment.PageCount; PageNumber: TYPE = Environment.PageNumber; NullFP: FP = File.nullCapability; FObject: TYPE = PRIVATE RECORD [ cap: Segments.FP, inuse: BOOLEAN, spare1, spare2, spare3: BOOLEAN, lock: [0..MaxFileLocks], link: FHandle]; MaxFileLocks: PRIVATE CARDINAL = 7777B; SObject: TYPE = PRIVATE RECORD [ file: FHandle, base: Segments.PageNumber, pages: Segments.PageCount, space: Space.Handle, inuse: BOOLEAN, mapped: BOOLEAN, killed: BOOLEAN, write: BOOLEAN, spare1, spare2, spare3: BOOLEAN, lock: [0..MaxSegLocks], link: SHandle]; MaxSegLocks: PRIVATE CARDINAL = 777B; -- S E G M E N T S AllocInfo: TYPE = PRIVATE CARDINAL; EasyUp: AllocInfo = 0; EasyDown: AllocInfo = 0; HardUp: AllocInfo = 0; HardDown: AllocInfo = 0; DefaultBase: Segments.PageNumber = LAST[Segments.PageNumber]; DefaultMDSBase: Segments.PageNumber = DefaultBase - 1; DefaultXMBase: Segments.PageNumber = DefaultMDSBase - 1; DefaultANYBase: Segments.PageNumber = DefaultXMBase - 1; SwapError: PRIVATE SIGNAL [seg: SHandle]; InvalidSegment: PRIVATE SIGNAL [s: UNSPECIFIED]; SwapProblem: PROC RETURNS [SIGNAL [seg: SHandle]] = INLINE {RETURN[SwapError]}; OutOfMemory: PROC RETURNS [SIGNAL [x: CARDINAL]] = INLINE { RETURN[LOOPHOLE[Space.InsufficientSpace]]}; DeleteSegment: PROCEDURE [seg: SHandle]; EnumerateSegments: PROCEDURE [proc: PROCEDURE [SHandle] RETURNS [BOOLEAN]] RETURNS [SHandle]; FlushSegmentCache: PROCEDURE; Kill: PROCEDURE [seg: SHandle, base: PageNumber ← DefaultBase]; MakeReadOnly: PROCEDURE [seg: SHandle]; MoveSegment: PROCEDURE [seg: SHandle, base: PageNumber, pages: PageCount]; NewSegment: PROCEDURE [file: FHandle, base: PageNumber, pages: PageCount, access: Access ← DefaultAccess] RETURNS [SHandle]; SegmentAddress: PROCEDURE [seg: SHandle] RETURNS [Segments.Address]; SwapIn: PROCEDURE [ seg: SHandle, base: PageNumber ← DefaultANYBase, info: AllocInfo ← EasyUp]; SwapOut: PROCEDURE [seg: SHandle]; SwapUp: PROCEDURE [seg: SHandle]; Unlock: PROCEDURE [seg: SHandle]; VMtoSegment: PROCEDURE [a: Segments.Address] RETURNS [SHandle]; 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.mapped]}; 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 {}; -- F I L E S: VersionOptions: TYPE = PRIVATE [0..3]; DefaultVersion: VersionOptions = 0; NewFileOnly: VersionOptions = 1; OldFileOnly: VersionOptions = 2; Access: TYPE = PRIVATE File.Permissions; AllAccess: Segments.Access = File.read + File.write + File.grow + File.shrink + File.delete; DefaultAccess: Segments.Access = 0; Read: Segments.Access = File.read; ReadWrite: Segments.Access = AllAccess; Write: Segments.Access = File.write + File.grow + File.shrink + File.delete; FileNameError: PRIVATE SIGNAL [name: STRING]; FileError: PRIVATE SIGNAL [f: FHandle]; InvalidFile: PRIVATE SIGNAL [f: UNSPECIFIED]; FileNameProblem: PROC RETURNS [SIGNAL [name: STRING]] = INLINE { RETURN[FileNameError]}; FileProblem: PROC RETURNS [SIGNAL [f: FHandle]] = INLINE {RETURN[FileError]}; FileUnknown: PROCEDURE RETURNS [SIGNAL] = INLINE {RETURN[LOOPHOLE[File.Unknown]]}; DestroyFile: PROCEDURE [file: FHandle]; EnumerateFiles: PROCEDURE [proc: PROCEDURE [FHandle] RETURNS [BOOLEAN]] RETURNS [file: FHandle]; FPFromFile: PROCEDURE [file: FHandle, fp: FPHandle] = INLINE {fp↑ ← file.cap}; GetFileProperties: PROCEDURE [file: FHandle] RETURNS [create, write, read: Time.Packed, length: LONG CARDINAL]; GetFileTimes: PROCEDURE [file: FHandle] RETURNS [create, write, read: Time.Packed]; GetFileLength: PROCEDURE [file: FHandle] RETURNS [LONG CARDINAL]; InsertFile: PROCEDURE [ file: Segments.FPHandle, access: Segments.Access ← DefaultAccess] RETURNS [FHandle]; NewFile: PROCEDURE [ name: STRING, access: Segments.Access ← DefaultAccess, version: VersionOptions ← DefaultVersion] RETURNS [FHandle]; LockFile: PROCEDURE [file: FHandle]; ReleasableFile: PROC [file: FHandle] RETURNS [BOOLEAN] = INLINE { RETURN[file.lock = 0]}; ReleaseFile: PROCEDURE [file: FHandle]; SetFileLength: PROCEDURE [file: FHandle, length: LONG CARDINAL]; SetFileTimes: PROCEDURE [file: FHandle, create, write, read: Time.Packed ← [0]]; UnlockFile: PROCEDURE [file: FHandle]; -- D I R E C T O R Y: EnumerateDirectory: PROC [ proc: PROC [Segments.FPHandle, STRING] RETURNS [BOOLEAN], files: STRING ← NIL, wantWholeName: BOOLEAN ← FALSE]; -- for Debugger Only: NameForFile: PROCEDURE [name: STRING, file: FHandle]; ModifyFile: PROCEDURE [name: STRING] RETURNS [BOOLEAN]; AddModifyProc: PROC [PROC [STRING, FHandle] RETURNS [BOOLEAN]]; InvalidateFileCache: PROCEDURE; FlushFileCache: PROCEDURE; END.