From efe27f1b05eb9aa4a3760951885c2eca78d6516f Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 4 Oct 2012 20:32:14 -0400 Subject: [PATCH] pull: Ensure worker queue finishes if we unhold an empty queue too --- src/libotutil/ot-worker-queue.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/libotutil/ot-worker-queue.c b/src/libotutil/ot-worker-queue.c index 797c1686..8bf71bee 100644 --- a/src/libotutil/ot-worker-queue.c +++ b/src/libotutil/ot-worker-queue.c @@ -79,10 +79,31 @@ ot_worker_queue_hold (OtWorkerQueue *queue) g_atomic_int_inc (&queue->holds); } +static gboolean +invoke_idle_callback (gpointer user_data) +{ + OtWorkerQueue *queue = user_data; + queue->idle_callback (queue->idle_data); + return FALSE; +} + void ot_worker_queue_release (OtWorkerQueue *queue) { - g_atomic_int_add (&queue->holds, -1); + if (!g_atomic_int_dec_and_test (&queue->holds)) + return; + + g_mutex_lock (&queue->mutex); + + if (!g_queue_peek_tail_link (&queue->queue)) + { + if (queue->idle_callback) + g_main_context_invoke (queue->idle_context, + invoke_idle_callback, + queue); + } + + g_mutex_unlock (&queue->mutex); } void @@ -95,14 +116,6 @@ ot_worker_queue_push (OtWorkerQueue *queue, g_mutex_unlock (&queue->mutex); } -static gboolean -invoke_idle_callback (gpointer user_data) -{ - OtWorkerQueue *queue = user_data; - queue->idle_callback (queue->idle_data); - return FALSE; -} - static gpointer ot_worker_queue_thread_main (gpointer user_data) {