From: Colin Walters Date: Tue, 14 Jun 2011 22:46:06 +0000 (-0400) Subject: gmain: Close race condition in _g_main_wake_up_all_contexts() X-Git-Tag: 2.29.10~84 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c9f883f133bc83942484cb8a1349b58ada46b4bc;p=platform%2Fupstream%2Fglib.git gmain: Close race condition in _g_main_wake_up_all_contexts() Running gthread/tests/spawn-multithreaded in a loop, I very easily hit: GLib-CRITICAL **: g_main_context_wakeup: assertion `g_atomic_int_get (&context->ref_count) > 0' failed Testing the refcount still left a window where we would fall into the assertion. Fix this by just locking the context. --- diff --git a/glib/gmain.c b/glib/gmain.c index c84d7b9..47b26cc 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -3774,16 +3774,11 @@ _g_main_wake_up_all_contexts (void) G_LOCK (main_context_list); for (list = main_context_list; list; list = list->next) { - GMainContext *context; - - context = list->data; - if (g_atomic_int_get (&context->ref_count) > 0) - /* Due to racing conditions we can find ref_count == 0, in - * that case, however, the context is still not destroyed - * and no poll can be active, otherwise the ref_count - * wouldn't be 0 - */ - g_main_context_wakeup (context); + GMainContext *context = list->data; + + LOCK_CONTEXT (context); + g_main_context_wakeup_unlocked (context); + UNLOCK_CONTEXT (context); } G_UNLOCK (main_context_list); } @@ -4635,8 +4630,6 @@ unix_signal_helper_thread (gpointer data) deliver_unix_signal (SIGINT); if (sighup_received) deliver_unix_signal (SIGHUP); - if (sigchld_received) - deliver_sigchld (); _g_main_wake_up_all_contexts (); } }