GENERIC INTERFACESyncQueue (Elem);
WhereElem.Tis a type that is not an open array type, andElemcontains
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.