void-packages/srcpkgs/glib/patches/revert-revert-4976e81.patch

79 lines
2.4 KiB
Diff
Raw Normal View History

This reverts the revert https://github.com/GNOME/glib/commit/4976e8109045b8aa72598668b809418d13e1f031
as it turns out to make e.g. LibreOffice eat 100% CPU ( #10807 )
--- glib/gmain.c 2018-01-08 21:00:49.000000000 +0100
+++ glib/gmain.c 2018-01-14 15:30:18.688036447 +0100
@@ -277,7 +277,8 @@
guint next_id;
GList *source_lists;
- gint in_check_or_prepare;
+ gboolean in_check_or_prepare;
+ gboolean need_wakeup;
GPollRec *poll_records;
guint n_poll_records;
@@ -651,6 +652,7 @@
context->pending_dispatches = g_ptr_array_new ();
+ context->need_wakeup = FALSE;
context->time_is_fresh = FALSE;
context->wakeup = g_wakeup_new ();
@@ -1127,17 +1129,11 @@
static void
conditional_wakeup (GMainContext *context)
{
- /* 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
+ /* 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.
*/
- if (context->owner != G_THREAD_SELF)
+ if (context->need_wakeup)
g_wakeup_signal (context->wakeup);
}
@@ -3400,6 +3396,10 @@
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)
@@ -3525,6 +3525,8 @@
}
}
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));
@@ -3659,6 +3661,12 @@
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)