From 265c78b9dfe48c3157e58b9c580d6f01a09b358b Mon Sep 17 00:00:00 2001 From: Sebastian Wilhelmi Date: Wed, 18 Feb 2004 12:30:01 +0000 Subject: [PATCH] Lazy creation of GCond. Only signal GCond, if threads are waiting. 2004-02-18 Sebastian Wilhelmi * glib/gasyncqueue.c: Lazy creation of GCond. Only signal GCond, if threads are waiting. --- glib/gasyncqueue.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/glib/gasyncqueue.c b/glib/gasyncqueue.c index 155e4ca..3ed3eb8 100644 --- a/glib/gasyncqueue.c +++ b/glib/gasyncqueue.c @@ -50,7 +50,7 @@ g_async_queue_new () { GAsyncQueue* retval = g_new (GAsyncQueue, 1); retval->mutex = g_mutex_new (); - retval->cond = g_cond_new (); + retval->cond = NULL; retval->queue = g_queue_new (); retval->waiting_threads = 0; retval->ref_count = 1; @@ -119,7 +119,8 @@ g_async_queue_unref_and_unlock (GAsyncQueue *queue) { g_return_if_fail (queue->waiting_threads == 0); g_mutex_free (queue->mutex); - g_cond_free (queue->cond); + if (queue->cond) + g_cond_free (queue->cond); g_queue_free (queue->queue); g_free (queue); } @@ -211,7 +212,8 @@ g_async_queue_push_unlocked (GAsyncQueue* queue, gpointer data) g_return_if_fail (data); g_queue_push_head (queue->queue, data); - g_cond_signal (queue->cond); + if (queue->waiting_threads > 0) + g_cond_signal (queue->cond); } static gpointer @@ -224,6 +226,10 @@ g_async_queue_pop_intern_unlocked (GAsyncQueue* queue, gboolean try, { if (try) return NULL; + + if (!queue->cond) + queue->cond = g_cond_new (); + if (!end_time) { queue->waiting_threads++; -- 2.7.4