GENERIC INTERFACESyncQueue (Elem);
WhereElem.T
is a type that is not an open array type, andElem
contains
CONST Brand = <text-constant>;
IMPORT Thread; EXCEPTION EndOfFile; TYPE T <: Public; Public = Private OBJECT METHODS init(sizeHint: CARDINAL := 5): T; put(READONLY e: Elem.T); close(); get(): Elem.T RAISES {EndOfFile, Thread.Alerted}; EOF(): BOOLEAN RAISES {Thread.Alerted}; size(): CARDINAL; END; Private <: ROOT;A SyncQueue.T, or synchronized queue, is a unidirectional pipeline that can be used for inter-thread communication.
The put
method appends a new element to the end of the queue. The
queue is allowed to grow without bound, so the put
operation never
blocks the calling thread.
The get
method removes and returns the element at the head of the
queue. If the queue is empty, get
blocks the calling thread, until
data is again available to be gotten.
Synchronized queues support the notion of an end-of-file marker. On
the writing side, the close
method (conceptually) appends an EOF
mark to the end of the queue. It is a checked runtime error to call
put
after close
has been called. If a get
operation encounters
the EOF marker, it raises the EndOfFile
exception. The presence of
the end-of-file may also be tested explicitly, by the EOF
method.
Note that, if the queue is empty but it has not been closed, the EOF
method will block the calling thread.
The size
method can be used to implement non-blocking gets. It
returns the number of elements that could be gotten without blocking.
For the purposes of size
, the end-of-file marker counts as one
element.
END SyncQueue.