-- Transport Mechanism Filestore - public DEFS for heap storage -- -- [Juniper]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.