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