-- 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.