tests/mainloop: fix a race condition
authorDan Winship <danw@gnome.org>
Fri, 13 Apr 2012 15:43:09 +0000 (11:43 -0400)
committerDan Winship <danw@gnome.org>
Fri, 13 Apr 2012 16:15:15 +0000 (12:15 -0400)
Rather than depending on the machine's speed/load, just interlock
between the two threads properly.

glib/tests/mainloop.c

index 614acc6..4d27985 100644 (file)
@@ -253,6 +253,9 @@ call_func (gpointer data)
   return G_SOURCE_REMOVE;
 }
 
+static GMutex mutex;
+static GCond cond;
+
 static gpointer
 thread_func (gpointer data)
 {
@@ -261,6 +264,10 @@ thread_func (gpointer data)
 
   g_main_context_push_thread_default (ctx);
 
+  g_mutex_lock (&mutex);
+  g_cond_signal (&cond);
+  g_mutex_unlock (&mutex);
+
   source = g_timeout_source_new (500);
   g_source_set_callback (source, (GSourceFunc)g_thread_exit, NULL, NULL);
   g_source_attach (source, ctx);
@@ -293,9 +300,10 @@ test_invoke (void)
    * to another thread
    */
   ctx = g_main_context_new ();
+  g_mutex_lock (&mutex);
   thread = g_thread_new ("worker", thread_func, ctx);
 
-  g_usleep (1000); /* give some time to push the thread-default */
+  g_cond_wait (&cond, &mutex);
 
   g_main_context_invoke (ctx, func, thread);
   g_assert_cmpint (count, ==, 2);