mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-11 03:46:17 +01:00
Revert "gmain: only signal GWakeup right before or during a blocking poll"
This reverts commit 9ba95e25b7
.
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
This commit is contained in:
parent
e9757096c2
commit
4976e81090
30
glib/gmain.c
30
glib/gmain.c
@ -277,8 +277,7 @@ struct _GMainContext
|
|||||||
|
|
||||||
guint next_id;
|
guint next_id;
|
||||||
GList *source_lists;
|
GList *source_lists;
|
||||||
gboolean in_check_or_prepare;
|
gint in_check_or_prepare;
|
||||||
gboolean need_wakeup;
|
|
||||||
|
|
||||||
GPollRec *poll_records;
|
GPollRec *poll_records;
|
||||||
guint n_poll_records;
|
guint n_poll_records;
|
||||||
@ -652,7 +651,6 @@ g_main_context_new (void)
|
|||||||
|
|
||||||
context->pending_dispatches = g_ptr_array_new ();
|
context->pending_dispatches = g_ptr_array_new ();
|
||||||
|
|
||||||
context->need_wakeup = FALSE;
|
|
||||||
context->time_is_fresh = FALSE;
|
context->time_is_fresh = FALSE;
|
||||||
|
|
||||||
context->wakeup = g_wakeup_new ();
|
context->wakeup = g_wakeup_new ();
|
||||||
@ -1129,11 +1127,17 @@ source_remove_from_context (GSource *source,
|
|||||||
static void
|
static void
|
||||||
conditional_wakeup (GMainContext *context)
|
conditional_wakeup (GMainContext *context)
|
||||||
{
|
{
|
||||||
/* This flag is set if at the start of prepare() we have no other ready
|
/* We want to signal wakeups in two cases:
|
||||||
* sources, and hence would wait in poll(). In that case, any other threads
|
* 1 When the context is owned by another thread
|
||||||
* attaching sources will need to signal a wakeup.
|
* 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);
|
g_wakeup_signal (context->wakeup);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3383,10 +3387,6 @@ g_main_context_prepare (GMainContext *context,
|
|||||||
|
|
||||||
LOCK_CONTEXT (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;
|
context->time_is_fresh = FALSE;
|
||||||
|
|
||||||
if (context->in_check_or_prepare)
|
if (context->in_check_or_prepare)
|
||||||
@ -3512,8 +3512,6 @@ g_main_context_prepare (GMainContext *context,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_source_iter_clear (&iter);
|
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));
|
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));
|
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++)
|
for (i = 0; i < n_fds; i++)
|
||||||
{
|
{
|
||||||
if (fds[i].fd == context->wake_up_rec.fd)
|
if (fds[i].fd == context->wake_up_rec.fd)
|
||||||
|
Loading…
Reference in New Issue
Block a user