[gtk2] Do not abort when releasing an unlocked mutex
Kalev Lember
kalev at fedoraproject.org
Thu Sep 4 11:27:24 UTC 2014
commit f4771315d217244e6d1e7dd3fb31895d0a0aa304
Author: Kalev Lember <kalevlember at gmail.com>
Date: Thu Sep 4 13:23:07 2014 +0200
Do not abort when releasing an unlocked mutex
Backport an upstream fix to avoid triggering abort() from F21 glib2 when
releasing a mutex that hasn't been locked yet.
https://bugzilla.redhat.com/show_bug.cgi?id=1138146
...not-release-the-GDK-lock-if-it-hasn-t-bee.patch | 88 ++++++++++++++++++++
gtk2.spec | 7 ++-
2 files changed, 94 insertions(+), 1 deletions(-)
---
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 <ebassi at gnome.org>
+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 <kalevlember at gmail.com> - 2.24.24-3
+- Do not abort when releasing an unlocked mutex (#1138146)
+
* Sat Aug 16 2014 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 2.24.24-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
More information about the scm-commits
mailing list