diff --git a/srcpkgs/glib/patches/revert-revert-4976e81.patch b/srcpkgs/glib/patches/revert-revert-4976e81.patch new file mode 100644 index 00000000000..d9377a8237e --- /dev/null +++ b/srcpkgs/glib/patches/revert-revert-4976e81.patch @@ -0,0 +1,78 @@ +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) diff --git a/srcpkgs/glib/template b/srcpkgs/glib/template index f03e22322df..3edd60a640e 100644 --- a/srcpkgs/glib/template +++ b/srcpkgs/glib/template @@ -1,7 +1,7 @@ # Template build file for 'glib' pkgname=glib version=2.54.3 -revision=1 +revision=2 build_style=gnu-configure configure_args="--enable-libelf --disable-fam --with-pcre=system --enable-static" hostmakedepends="automake libtool pkg-config perl python libxslt docbook-xsl"