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 emitted 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....