-- Transport mechanism: Heap implementation of R-Lists -- [Juniper]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.