From 4976e8109045b8aa72598668b809418d13e1f031 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 3 Jan 2018 11:25:52 +0000 Subject: [PATCH] Revert "gmain: only signal GWakeup right before or during a blocking poll" This reverts commit 9ba95e25b74adf8d62effeaf6567074ac932811c. It is causing undiagnosed problems with WebKit and other users of GLib. See https://bugzilla.gnome.org/show_bug.cgi?id=761102#c44 and https://bugzilla.gnome.org/show_bug.cgi?id=761102#c46. Reverting it until someone works out what the problem is. https://bugzilla.gnome.org/show_bug.cgi?id=761102 --- glib/gmain.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/glib/gmain.c b/glib/gmain.c index 7b7129701..d5b66bf83 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -277,8 +277,7 @@ struct _GMainContext guint next_id; GList *source_lists; - gboolean in_check_or_prepare; - gboolean need_wakeup; + gint in_check_or_prepare; GPollRec *poll_records; guint n_poll_records; @@ -652,7 +651,6 @@ g_main_context_new (void) context->pending_dispatches = g_ptr_array_new (); - context->need_wakeup = FALSE; context->time_is_fresh = FALSE; context->wakeup = g_wakeup_new (); @@ -1129,11 +1127,17 @@ source_remove_from_context (GSource *source, static void conditional_wakeup (GMainContext *context) { - /* This flag is set if at the start of prepare() we have no other ready - * sources, and hence would wait in poll(). In that case, any other threads - * attaching sources will need to signal a wakeup. + /* We want to signal wakeups in two cases: + * 1 When the context is owned by another thread + * 2 When the context owner is NULL (two subcases) + * 2a Possible if the context has never been acquired + * 2b Or if the context has no current owner + * + * At least case 2a) is necessary to ensure backwards compatibility with + * qemu's use of GMainContext. + * https://bugzilla.gnome.org/show_bug.cgi?id=761102#c14 */ - if (context->need_wakeup) + if (context->owner != G_THREAD_SELF) g_wakeup_signal (context->wakeup); } @@ -3383,10 +3387,6 @@ g_main_context_prepare (GMainContext *context, LOCK_CONTEXT (context); - /* context->need_wakeup is protected by LOCK_CONTEXT/UNLOCK_CONTEXT, - * so need not set it yet. - */ - context->time_is_fresh = FALSE; if (context->in_check_or_prepare) @@ -3512,8 +3512,6 @@ g_main_context_prepare (GMainContext *context, } } g_source_iter_clear (&iter); - /* See conditional_wakeup() where this is used */ - context->need_wakeup = (n_ready == 0); TRACE (GLIB_MAIN_CONTEXT_AFTER_PREPARE (context, current_priority, n_ready)); @@ -3648,12 +3646,6 @@ g_main_context_check (GMainContext *context, TRACE (GLIB_MAIN_CONTEXT_BEFORE_CHECK (context, max_priority, fds, n_fds)); - /* We don't need to wakeup during check or dispatch, because - * all sources will be re-evaluated during prepare/query. - */ - context->need_wakeup = FALSE; - - /* And if we have a wakeup pending, acknowledge it */ for (i = 0; i < n_fds; i++) { if (fds[i].fd == context->wake_up_rec.fd)