<> <> <> <<>> <> <<>> <> <<>> DIRECTORY LoganBerry USING [Entry], LoganQuery USING [ComplexCursor], Rope USING [ROPE]; TapMsgQueue: CEDAR DEFINITIONS ~ BEGIN ROPE: TYPE ~ Rope.ROPE; <> Msg: TYPE ~ LIST OF MsgField; MsgField: TYPE ~ RECORD [ type: ATOM, -- field tag value: ROPE -- field contents ]; <> MsgQueue: TYPE ~ REF MsgQueueRec; MsgQueueRec: TYPE ~ RECORD [ class: QueueClass _ NIL, -- queue's class nonempty: CONDITION, -- for notifications that message is available closed: BOOLEAN _ FALSE, -- operations no longer allowed data: REF -- data slot for class implementor ]; <> Get: PROC [queue: MsgQueue, wait: BOOLEAN _ FALSE] RETURNS [msg: Msg]; <> <<>> Put: PROC [msg: Msg, queue: MsgQueue] RETURNS []; <> <<>> Close: PROC [queue: MsgQueue] RETURNS []; <> <<>> Create: PROC [] RETURNS [queue: MsgQueue]; <> <<>> Duplicate: PROC [queue: MsgQueue] RETURNS [q1, q2: MsgQueue]; <> <<>> Merge: PROC [q1, q2: MsgQueue] RETURNS [queue: MsgQueue]; <> <<>> <> <> QueueClass: TYPE = REF QueueClassRec; QueueClassRec: TYPE = RECORD [ flavor: ATOM _ NIL, -- name of queue's class get: GetProc _ NIL, -- get next message from queue put: PutProc _ NIL, -- put message onto queue close: CloseProc _ NIL -- destroy the queue ]; GetProc: TYPE = PROC [queue: MsgQueue] RETURNS [msg: Msg]; <> PutProc: TYPE = PROC [queue: MsgQueue, msg: Msg] RETURNS []; <> CloseProc: TYPE = PROC [queue: MsgQueue] RETURNS []; <> <> CursorFromMsgQueue: PROC [mq: MsgQueue] RETURNS [cursor: LoganQuery.ComplexCursor]; <> EntryFromMsg: PROC [msg: Msg] RETURNS [entry: LoganBerry.Entry]; <> MsgFromEntry: PROC [entry: LoganBerry.Entry] RETURNS [msg: Msg]; <> END.