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