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

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

-- HGM May 23, 1984 7:54:12 pm PDT --
-- Andrew Birrell 24-Feb-81 15:19:36 --

DIRECTORY
Rope USING [ROPE],
GVBasics USING [ItemHeader, RName],
ObjectDirDefs USING [ObjectNumber, ObjectType],
GVProtocol USING [Handle];


HeapDefs: DEFINITIONS =
BEGIN



-- General --

Buffer:  TYPE = RECORD[ where: POINTER, length: CARDINAL ];

ObjectNumber: TYPE = ObjectDirDefs.ObjectNumber;
-- reference counts are maintained internally on object numbers, and the
-- corresponding object is retained until its reference count falls to
-- zero --

ObjectOffset: TYPE = LONG CARDINAL;
-- Word position within an object. --

objectStart: ObjectOffset = 0;
-- Position of first word in any object --

ObjectType: TYPE = ObjectDirDefs.ObjectType;




-- Writer primitives --

WriterHandle: TYPE = POINTER TO WriterData;

WriterData: TYPE;

HeapStartWrite: PROCEDURE[ type: ObjectType ]
  RETURNS[ WriterHandle ];
-- Creates a writer. Allocates a new object number, initialises the
-- object to have the given type and to be empty, and sets its
-- reference count to one. The "type" is useful only in restarting. --

HeapWriteData: PROCEDURE[ handle: WriterHandle, from: Buffer ];
-- Appends the data to the object, using as many sub-objects as needed.
-- The data is not written to permanent storage at this stage. --

HeapEndWrite: PROCEDURE[ handle: WriterHandle,
    action: PROCEDURE[ObjectNumber] ];
-- Ensures (atomically) that the object is on disk and will be there
-- after a restart. Destroys the writer; the WriterHandle must not be
-- used after this point. Calls "action" with the object number, then
-- decrements the reference count on the object. If you still want the
-- object, "action" must cause the reference count to be incremented. --

HeapAbandonWrite: PROCEDURE[ handle: WriterHandle ];
-- Throws away the object, ensuring that it will not appear after a
-- restart. --

GetWriterOffset: PROCEDURE[ handle: WriterHandle ]
  RETURNS[ ObjectOffset ];
-- Returns the offset in the object of the next word that will be
-- written. --

SetWriterOffset: PROCEDURE[ handle: WriterHandle, offset: ObjectOffset ];
-- Re-postiions the writer so that "offset" is the offset in the object
-- of the next word to be written. --




-- Reader primitives --

ReaderHandle: TYPE = POINTER TO ReaderData;

ReaderData: TYPE;

HeapStartRead: PROCEDURE[ ObjectNumber ]
  RETURNS[ ReaderHandle ];
-- Creates a reader to read from the given object. Increments the
-- reference count on the object. --

CloseToReader: PROCEDURE[ handle: WriterHandle ]
  RETURNS[ ReaderHandle ];
-- Similar to HeapEndWrite, but a reader is created. The object is
-- left with reference count 1 (for the reader). --

HeapReadData: PROCEDURE[ from: ReaderHandle, to: Buffer ]
   RETURNS[ end: BOOLEAN, used: CARDINAL ];
-- Fills as much of the buffer as possible by reading from the object.
-- On exit, either "end" or "used=to.length" (or both) --

HeapEndRead: PROCEDURE[ from: ReaderHandle ];
-- Decrements the reference count on the object and destroys the
-- reader. The ReaderHandle must not be used after this point. --

CopyReader: PROCEDURE[ from: ReaderHandle ]
  RETURNS[ ReaderHandle ];
-- Increments the reference count on the object, and returns a new
-- reader positioned to the same place in the object. --

GetReaderOffset: PROCEDURE[ from: ReaderHandle ]
  RETURNS[ ObjectOffset ];
-- Returns the offset in the object of the next word that will be read. --

SetReaderOffset: PROCEDURE[ from: ReaderHandle, offset: ObjectOffset];
-- Re-positions the reader so that "offset" is the offset in the object
-- of the next word to be read. --

GetReaderObject: PROCEDURE[ from: ReaderHandle ]
  RETURNS[ ObjectNumber ];
-- Tells you the object number for this reader --




-- Restart primitives --

HeapRestart: PROGRAM RETURNS[ initHeap: BOOLEAN ];
-- Re-constructs the heap objects, and registers them in the object
-- directory with reference count 0. The compactor is not yet running. --

Compactor: PROGRAM; -- never returns --




-- Writer utilities --

HeapWriteString: PROCEDURE[ handle: WriterHandle, s: Rope.ROPE ];
-- Appends the string to the object --

HeapWriteRName: PROCEDURE[ handle: WriterHandle, rName: GVBasics.RName ] =
INLINE { HeapWriteString[handle,rName] };

WriteItemHeader: PROCEDURE[ handle: WriterHandle,
     header: GVBasics.ItemHeader ];

ReceiveComponent: PROCEDURE[handle: WriterHandle,
     str: GVProtocol.Handle ];
-- reads a single R-Server component from the stream --
-- May signal GVProtocol.Failed --

ReceiveObj: PROCEDURE[ handle: WriterHandle, str: GVProtocol.Handle];
-- Reads from the stream into the object until EndSST --
-- May signal GVProtocol.Failed --




-- Reader utilities --

HeapReadString: PROCEDURE[ from: ReaderHandle, s: Rope.ROPE]
  RETURNS[ ended: BOOLEAN ];
-- Reads a string from the object into the given storage. Returns
-- whether the object has now ended. --

HeapReadRName: PROCEDURE[ from: ReaderHandle, rName: GVBasics.RName]
  RETURNS[ ended: BOOLEAN ] = INLINE
{ RETURN[ HeapReadString[from, rName ] ] };

ReadItemHeader: PROCEDURE[ from: ReaderHandle ]
  RETURNS[ header: GVBasics.ItemHeader];

ReadRList: PROCEDURE[ from: ReaderHandle,
    work: PROCEDURE[GVBasics.RName]
     RETURNS[done:BOOLEAN] ];
-- reads a component, calling "work" for each R-Name. --

SendComponent: PROCEDURE[ from: ReaderHandle, str: GVProtocol.Handle ];
-- Copies an R-Server component onto the stream --
-- May signal GVProtocol.Failed --

SendObj: PROCEDURE[ from: ReaderHandle, str: GVProtocol.Handle];
-- Copies the object into the stream, followed by EndSST --
-- May signal GVProtocol.Failed --


END.