[ostree] pull: Ensure worker queue finishes if we unhold an empty queue too
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] pull: Ensure worker queue finishes if we unhold an empty queue too
- Date: Fri, 5 Oct 2012 00:33:12 +0000 (UTC)
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]