diff --git a/0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch b/0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch new file mode 100644 index 0000000..c4fa6df --- /dev/null +++ b/0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch @@ -0,0 +1,88 @@ +From fbf38d16bcc26630f0f721d266509f5bc292f606 Mon Sep 17 00:00:00 2001 +From: Emmanuele Bassi +Date: Tue, 26 Aug 2014 12:07:34 +0100 +Subject: [PATCH] threads: Do not release the GDK lock if it hasn't been + acquired yet +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Since GLib ≥ 2.41, attempting to release an unlocked mutex will abort(), +as it happens on most systems already. + +Given the lack of proper documentation on how to use GDK with threads, +there is code in the wild that does: + + gdk_threads_init (); + gdk_init (); + + ... + + gtk_main (); + +instead of the idiomatically correct: + + gdk_threads_init (); + gdk_threads_enter (); + + gtk_init (); + + ... + + gtk_main (); + + ... + + gdk_threads_leave (); + +Which means that gtk_main() will try to release the GDK lock, and thus +trigger an error from GLib. + +we cannot really fix all the wrong code everywhere, and since it does +not cost us anything, we can work around the issue inside GDK itself, by +trying to acquire the GDK lock inside gdk_threads_leave() with +trylock(). + +https://bugzilla.gnome.org/show_bug.cgi?id=735428 +--- + gdk/gdk.c | 24 +++++++++++++++++++++++- + 1 file changed, 23 insertions(+), 1 deletion(-) + +diff --git a/gdk/gdk.c b/gdk/gdk.c +index 0106d8a..f722dbf 100644 +--- a/gdk/gdk.c ++++ b/gdk/gdk.c +@@ -434,7 +434,29 @@ static void + gdk_threads_impl_unlock (void) + { + if (gdk_threads_mutex) +- g_mutex_unlock (gdk_threads_mutex); ++ { ++ /* we need a trylock() here because trying to unlock a mutex ++ * that hasn't been locked yet is: ++ * ++ * a) not portable ++ * b) fail on GLib ≥ 2.41 ++ * ++ * trylock() will either succeed because nothing is holding the ++ * GDK mutex, and will be unlocked right afterwards; or it's ++ * going to fail because the mutex is locked already, in which ++ * case we unlock it as expected. ++ * ++ * this is needed in the case somebody called gdk_threads_init() ++ * without calling gdk_threads_enter() before calling gtk_main(). ++ * in theory, we could just say that this is undefined behaviour, ++ * but our documentation has always been *less* than explicit as ++ * to what the behaviour should actually be. ++ * ++ * see bug: https://bugzilla.gnome.org/show_bug.cgi?id=735428 ++ */ ++ g_mutex_trylock (gdk_threads_mutex); ++ g_mutex_unlock (gdk_threads_mutex); ++ } + } + + /** +-- +2.1.0 + diff --git a/gtk2.spec b/gtk2.spec index 3657130..40f8abf 100644 --- a/gtk2.spec +++ b/gtk2.spec @@ -18,7 +18,7 @@ Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X Name: gtk2 Version: 2.24.24 -Release: 2%{?dist} +Release: 3%{?dist} License: LGPLv2+ Group: System Environment/Libraries URL: http://www.gtk.org @@ -35,6 +35,7 @@ Patch2: icon-padding.patch Patch8: tooltip-positioning.patch # https://bugzilla.gnome.org/show_bug.cgi?id=611313 Patch15: window-dragging.patch +Patch16: 0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch BuildRequires: atk-devel >= %{atk_version} BuildRequires: glib2-devel >= %{glib2_version} @@ -146,6 +147,7 @@ This package contains developer documentation for the GTK+ widget toolkit. %patch2 -p1 -b .icon-padding %patch8 -p1 -b .tooltip-positioning %patch15 -p1 -b .window-dragging +%patch16 -p1 -b .trylock %build (if ! test -x configure; then NOCONFIGURE=1 ./autogen.sh; CONFIGFLAGS=--enable-gtk-doc; fi; @@ -335,6 +337,9 @@ gtk-query-immodules-2.0-%{__isa_bits} --update-cache %doc tmpdocs/examples %changelog +* Thu Sep 04 2014 Kalev Lember - 2.24.24-3 +- Do not abort when releasing an unlocked mutex (#1138146) + * Sat Aug 16 2014 Fedora Release Engineering - 2.24.24-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild