summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Wilhelmi <seppi@seppi.de>2004-02-18 12:30:01 +0000
committerSebastian Wilhelmi <wilhelmi@src.gnome.org>2004-02-18 12:30:01 +0000
commit265c78b9dfe48c3157e58b9c580d6f01a09b358b (patch)
treedffe3047364b79b354ffa1b4dec4e8a0e3033d2b
parent1a2b93f361ffde2a8cf487373926386d662116a6 (diff)
Lazy creation of GCond. Only signal GCond, if threads are waiting.
2004-02-18 Sebastian Wilhelmi <seppi@seppi.de> * glib/gasyncqueue.c: Lazy creation of GCond. Only signal GCond, if threads are waiting.
-rw-r--r--glib/gasyncqueue.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/glib/gasyncqueue.c b/glib/gasyncqueue.c
index 155e4ca83..3ed3eb893 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++;