-- file: LaurelStateDefs.mesa
-- edited by Levin: January 27, 1981 11:56 AM
-- edited by Brotz: November 19, 1981 12:02 PM
DIRECTORY
AltoDefs USING [PageNumber],
AltoFileDefs USING [FP, TIME, vDA],
drD: FROM "LaurelDriverDefs" USING [InstallError],
SegmentDefs USING [DataSegmentHandle, FileHandle, FileSegmentHandle];
lsD: DEFINITIONS =
BEGIN
--*** Public Interface ***--
-- Types --
StateSegment: TYPE = POINTER TO StateSegmentObject;
PageNumber: TYPE = CARDINAL;
PageCount: TYPE = CARDINAL;
-- Facilities to be used during installation only --
AllocateStateNode: PROCEDURE [size: CARDINAL] RETURNS [POINTER];
-- analogous to SystemDefs.AllocateHeapNode, except that it allocates a node in the
-- permanent state heap, which is retained across sessions. Such nodes can never be
-- deallocated.
AllocateStateString: PROCEDURE [chars: CARDINAL] RETURNS [STRING];
-- analogous to SystemDefs.AllocateHeapString.
DefineStateSegment: PROCEDURE [nPages: PageCount] RETURNS [StateSegment];
-- reserves a segment of length nPages in the file Laurel.state and returns a segment
-- describing it, which is used in the following procedures. As with state nodes, these
-- segments will persist across sessions. It is the client’s responsibility to ensure that the
-- StateSegment (handle) returned is preserved as well (e.g., in another state segment, a
-- state node, IntCommon, or DisplayCommon).
-- Facilities usable at any time --
stateFile: SegmentDefs.FileHandle;
WriteStateSegment: PROCEDURE [segment: StateSegment];
-- writes the segment to the disk.
SwapInStateSegment: PROCEDURE [segment: StateSegment] RETURNS [POINTER];
-- swaps the given segment into memory and locks it. The pointer returned is the
-- starting address of the segment in main storage.
StateSegmentAddress: PROCEDURE [segment: StateSegment] RETURNS [POINTER];
-- The pointer returned is the starting address of the segment in main storage.
-- The segment must be swapped in and not yet released.
ReleaseStateSegment: PROCEDURE [segment: StateSegment];
-- decrements the lock count on the segment, which must be in main memory. If the
-- lock count becomes zero, the segment may be removed from main memory.
--*** Private Interface ***--
StateHeader: PRIVATE TYPE =
MACHINE DEPENDENT RECORD[
imageFP: AltoFileDefs.FP, -- must be first
imageTime: AltoFileDefs.TIME, -- must be second
profileFP: AltoFileDefs.FP,
profileTime: AltoFileDefs.TIME,
fontsWidthsFP: AltoFileDefs.FP,
fontsWidthsTime: AltoFileDefs.TIME,
headerFF: CARDINAL,
intCOffset: CARDINAL,
disCOffset: CARDINAL,
segmentList: StateSegment,
firstSegmentPage: PageNumber,
heapSegFirstPage: PageNumber,
heapSegPages: PageCount,
heapSegDA: AltoFileDefs.vDA,
imageDATableSeg: StateSegment,
profileInUserCm: BOOLEAN,
cachedHeapTop: AltoDefs.PageNumber];
StateSegmentObject: TYPE =
PRIVATE MACHINE DEPENDENT RECORD[
pages: PUBLIC PageCount,
link: StateSegment,
body: SELECT OVERLAID * FROM
inStateFile => [hint: AltoFileDefs.vDA],
inCore => [fsh: SegmentDefs.FileSegmentHandle],
ENDCASE];
InstallSegments: PRIVATE PROCEDURE [header: POINTER TO StateHeader];
InitializeSegments: PRIVATE PROCEDURE [header: POINTER TO StateHeader];
CreateLaurelState: PRIVATE PROCEDURE [heapDS: SegmentDefs.DataSegmentHandle]
RETURNS [drD.InstallError];
GetWrittenTime: PRIVATE PROCEDURE [file: SegmentDefs.FileHandle]
RETURNS [time: AltoFileDefs.TIME];
END. -- of LaurelStateDefs --