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