[ostree] pull: Ensure worker queue finishes if we unhold an empty queue too



commit efe27f1b05eb9aa4a3760951885c2eca78d6516f
Author: Colin Walters <walters verbum org>
Date:   Thu Oct 4 20:32:14 2012 -0400

    pull: Ensure worker queue finishes if we unhold an empty queue too

 src/libotutil/ot-worker-queue.c |   31 ++++++++++++++++++++++---------
 1 files changed, 22 insertions(+), 9 deletions(-)
---
diff --git a/src/libotutil/ot-worker-queue.c b/src/libotutil/ot-worker-queue.c
index 797c168..8bf71be 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)
 {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]