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.