-- Transport Mechanism Filestore - private DEFS for heap storage --

-- [Juniper]<Grapevine>MS>HeapXDefs.mesa

-- Andrew Birrell	24-Feb-81 15:47:29 --

DIRECTORY
HeapDefs	USING[ ObjectNumber, ObjectOffset ],
VMDefs		USING[ FullAddress, PageAddress, Page, PageIndex,
		       LookAheadCount ];

HeapXDefs: DEFINITIONS = BEGIN


-- Layout of objects on disk --

ObjectHeader:	TYPE = MACHINE DEPENDENT RECORD[
			size: CARDINAL,
			number: HeapDefs.ObjectNumber];

PageHeader:	TYPE = MACHINE DEPENDENT RECORD[
			offset: HeapDefs.ObjectOffset];


-- Writer --

WriterHandle:	TYPE = POINTER TO WriterData;

WriterData:	TYPE = MONITORED RECORD[
			next:	WriterHandle, -- free chain --
			page:	VMDefs.Page,
			object:	HeapDefs.ObjectNumber,
			offset:	HeapDefs.ObjectOffset,
			start:	VMDefs.PageAddress, -- first value of wPos.page --
			max:	VMDefs.FullAddress, -- max wPos if reWriting --
			reWriting: BOOLEAN,
			base:	VMDefs.PageIndex, --start of sub-object data--
			wPos:	VMDefs.FullAddress,
			objectHead: POINTER TO ObjectHeader];


-- Reader --

ReaderHandle:	TYPE = POINTER TO ReaderData;

ReaderData:	TYPE = MONITORED RECORD[
			next:	ReaderHandle,
			page:	VMDefs.Page,
			object:	HeapDefs.ObjectNumber,
			offset:	HeapDefs.ObjectOffset,
			where:	VMDefs.FullAddress,
			end:	BOOLEAN,
			stopped: BOOLEAN,
			canStart: CONDITION ];

lookAhead:	VMDefs.LookAheadCount = 2;
   -- used by readers and compactor --


-- Compactor interlock --

StopAllReaders:	PROCEDURE[ HeapDefs.ObjectNumber ];
   -- Stops any reader which is reading this object. --

RestartAllReaders:	PROCEDURE[ HeapDefs.ObjectNumber ];
   -- Allows stopped readers to continue; the object may have moved in the
   -- heap. --

StopReader:	PROCEDURE[ from: ReaderHandle ];
    -- Tells the reader to stop. --

RestartReader:	PROCEDURE[ from: ReaderHandle ];
   -- Tells the reader to restart and re-calculate its position within the
   -- heap, since the object may have moved. --

END.