-- Transport mechanism: Heap implementation of R-Lists

-- [Juniper]<dms>MS>HeapRList.mesa

-- Andrew Birrell   4-Aug-80 16:19:12

DIRECTORY
BodyDefs	USING[ RName ],
HeapDefs	USING[ HeapAbandonWrite, HeapEndRead, HeapEndWrite,
		       HeapStartRead, HeapStartWrite, ObjectNumber,
		       objectStart, ReaderHandle, ReadRList,
		       ReceiveComponent, SetReaderOffset, WriterHandle ],
ProtocolDefs	USING[ Handle ],
RListDefs	USING[];

HeapRList: PROGRAM
IMPORTS HeapDefs
EXPORTS RListDefs =

BEGIN

RListHandle: PUBLIC TYPE = HeapDefs.ReaderHandle;

Receive: PUBLIC PROC[str: ProtocolDefs.Handle]
   RETURNS[ list: RListHandle ] =
   BEGIN
   writer: HeapDefs.WriterHandle = HeapDefs.HeapStartWrite[temp];
   Accept: PROC[obj: HeapDefs.ObjectNumber] =
      { list ← HeapDefs.HeapStartRead[obj] };
   HeapDefs.ReceiveComponent[writer, str ! UNWIND =>
                         HeapDefs.HeapAbandonWrite[writer] ];
   HeapDefs.HeapEndWrite[writer, Accept];
   END;

Enumerate: PUBLIC PROC[list: RListHandle,
                       work: PROC[BodyDefs.RName]RETURNS[done:BOOLEAN] ] =
   BEGIN
   HeapDefs.SetReaderOffset[list, HeapDefs.objectStart];
   HeapDefs.ReadRList[list, work];
   END;

Close: PUBLIC PROC[list: RListHandle] =
   { HeapDefs.HeapEndRead[list] };

END.