-- Transport Mechanism Filestore - public DEFS for heap storage -- -- [Juniper]<Grapevine>MS>HeapDefs.mesa -- Andrew Birrell 24-Feb-81 15:19:36 -- DIRECTORY BodyDefs: FROM "BodyDefs" USING[ ItemHeader, RName ], ObjectDirDefs: FROM "ObjectDirDefs" USING[ ObjectNumber, ObjectType ], ProtocolDefs: FROM "ProtocolDefs" 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: STRING ]; -- Appends the string to the object -- HeapWriteRName: PROCEDURE[ handle: WriterHandle, rName: BodyDefs.RName ] = INLINE { HeapWriteString[handle,rName] }; WriteItemHeader: PROCEDURE[ handle: WriterHandle, header: BodyDefs.ItemHeader ]; ReceiveComponent: PROCEDURE[handle: WriterHandle, str: ProtocolDefs.Handle ]; -- reads a single R-Server component from the stream -- -- May signal ProtocolDefs.Failed -- ReceiveObj: PROCEDURE[ handle: WriterHandle, str: ProtocolDefs.Handle ]; -- Reads from the stream into the object until EndSST -- -- May signal ProtocolDefs.Failed -- -- Reader utilities -- HeapReadString: PROCEDURE[ from: ReaderHandle, s: STRING] 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: BodyDefs.RName] RETURNS[ ended: BOOLEAN ] = INLINE { RETURN[ HeapReadString[from, rName ] ] }; ReadItemHeader: PROCEDURE[ from: ReaderHandle ] RETURNS[ header: BodyDefs.ItemHeader]; ReadRList: PROCEDURE[ from: ReaderHandle, work: PROCEDURE[BodyDefs.RName] RETURNS[done:BOOLEAN] ]; -- reads a component, calling "work" for each R-Name. -- SendComponent: PROCEDURE[ from: ReaderHandle, str: ProtocolDefs.Handle ]; -- Copies an R-Server component onto the stream -- -- May signal ProtocolDefs.Failed -- SendObj: PROCEDURE[ from: ReaderHandle, str: ProtocolDefs.Handle]; -- Copies the object into the stream, followed by EndSST -- -- May signal ProtocolDefs.Failed -- END.