-- 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 --