thread 1                                         thread2

                             				   // the queue is empty
                                                           while (!queue->level_buffers) {
                                                             STATUS("queue: %s U released lock\n");
                                                             GST_OBJECT_UNLOCK (queue);

  // thread1 is scheduled and puts a lot of buffers
  // in the queue

  // thread1 has put the last buffer on the queue
  // here. A signal is going to be emited

  tosignal = (queue->level_buffers >= 0);
  queue->level_buffers++;

  /* we can unlock now */
  GST_OBJECT_UNLOCK (queue);

  if (tosignal) {
    g_mutex_lock (queue->emptylock);
    g_cond_signal (queue->emptycond);
    g_mutex_unlock (queue->emptylock);
  }

                                                             g_mutex_lock (queue->emptylock);
							     // wait forever
                                                             g_cond_wait (queue->emptycond, queue->emptylock);
                                                             g_mutex_unlock (queue->emptylock);
                                                             GST_OBJECT_LOCK (queue);
                                                           }
							   

  // thread 1 will also wait forever because the
  // queue is filled....