Lazy creation of GCond. Only signal GCond, if threads are waiting.
authorSebastian Wilhelmi <seppi@seppi.de>
Wed, 18 Feb 2004 12:30:01 +0000 (12:30 +0000)
committerSebastian Wilhelmi <wilhelmi@src.gnome.org>
Wed, 18 Feb 2004 12:30:01 +0000 (12:30 +0000)
2004-02-18  Sebastian Wilhelmi  <seppi@seppi.de>

* glib/gasyncqueue.c: Lazy creation of GCond. Only
signal GCond, if threads are waiting.

glib/gasyncqueue.c

index 155e4ca83b49765fa0a53fc37d4b12ab7656160c..3ed3eb8939f3168f0ef9a78716c50c9f14d2abca 100644 (file)
@@ -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++;