diff options
author | Sebastian Wilhelmi <seppi@seppi.de> | 2004-02-18 12:30:01 +0000 |
---|---|---|
committer | Sebastian Wilhelmi <wilhelmi@src.gnome.org> | 2004-02-18 12:30:01 +0000 |
commit | 265c78b9dfe48c3157e58b9c580d6f01a09b358b (patch) | |
tree | dffe3047364b79b354ffa1b4dec4e8a0e3033d2b | |
parent | 1a2b93f361ffde2a8cf487373926386d662116a6 (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.c | 12 |
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++; |