[gtk3/f18] Fix an icon theme reentrancy issue

Matthias Clasen mclasen at fedoraproject.org
Wed Jun 19 20:51:38 UTC 2013


commit d26cb3cea626ceef6af56b4d2073d202de162ace
Author: Matthias Clasen <mclasen at redhat.com>
Date:   Wed Jun 19 16:51:18 2013 -0400

    Fix an icon theme reentrancy issue

 ...conTheme-Move-changed-emission-to-an-idle.patch |  115 ++++++++++++++++++++
 gtk3.spec                                          |    9 ++-
 2 files changed, 123 insertions(+), 1 deletions(-)
---
diff --git a/0001-IconTheme-Move-changed-emission-to-an-idle.patch b/0001-IconTheme-Move-changed-emission-to-an-idle.patch
new file mode 100644
index 0000000..7768f33
--- /dev/null
+++ b/0001-IconTheme-Move-changed-emission-to-an-idle.patch
@@ -0,0 +1,115 @@
+From 3b0fd46b1ad53aa07e038241f4c8a980ed72780f Mon Sep 17 00:00:00 2001
+From: Matthias Clasen <mclasen at redhat.com>
+Date: Wed, 19 Jun 2013 16:48:43 -0400
+Subject: [PATCH] IconTheme: Move changed emission to an idle
+
+By delaying the emission to an idle we avoid a lot of tricky
+reentrancy issues. For instance, a normal gtk_icon_theme_choose_icon()
+call could in very rare cases (when a user updated an icon theme) emit
+a signal which could affect the icon currently being looked up.  This
+kind of reentrancy is very hard to test against, especially when it is
+so rare, so we're better of avoiding it.
+
+There is no real value to get the change signal directly anyway. All
+it can do is affect which icon is rendered the next frame, and we will
+handle the queued emission before rendering. Not to mention that icon
+theme change detection is polled anyway, so it is already delayed.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=694755
+---
+ gtk/gtkicontheme.c | 36 +++++++++++++++++++++---------------
+ 1 file changed, 21 insertions(+), 15 deletions(-)
+
+diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
+index 58b643f..0490061 100644
+--- a/gtk/gtkicontheme.c
++++ b/gtk/gtkicontheme.c
+@@ -194,7 +194,7 @@ struct _GtkIconThemePrivate
+   glong last_stat_time;
+   GList *dir_mtimes;
+ 
+-  gulong reset_styles_idle;
++  gulong theme_changed_idle;
+ };
+ 
+ struct _GtkIconInfo
+@@ -690,7 +690,7 @@ free_dir_mtime (IconThemeDirMtime *dir_mtime)
+ }
+ 
+ static gboolean
+-reset_styles_idle (gpointer user_data)
++theme_changed_idle (gpointer user_data)
+ {
+   GtkIconTheme *icon_theme;
+   GtkIconThemePrivate *priv;
+@@ -698,14 +698,27 @@ reset_styles_idle (gpointer user_data)
+   icon_theme = GTK_ICON_THEME (user_data);
+   priv = icon_theme->priv;
+ 
++  g_signal_emit (icon_theme, signal_changed, 0);
++
+   if (priv->screen && priv->is_screen_singleton)
+     gtk_style_context_reset_widgets (priv->screen);
+ 
+-  priv->reset_styles_idle = 0;
++  priv->theme_changed_idle = 0;
+ 
+   return FALSE;
+ }
+ 
++ static void
++queue_theme_changed (GtkIconTheme *icon_theme)
++{
++  GtkIconThemePrivate *priv = icon_theme->priv;
++
++  if (!priv->theme_changed_idle)
++    priv->theme_changed_idle =
++      gdk_threads_add_idle_full (GTK_PRIORITY_RESIZE - 2,
++                                 theme_changed_idle, icon_theme, NULL);
++}
++
+ static void
+ do_theme_change (GtkIconTheme *icon_theme)
+ {
+@@ -717,12 +730,7 @@ do_theme_change (GtkIconTheme *icon_theme)
+   GTK_NOTE (ICONTHEME, 
+ 	    g_print ("change to icon theme \"%s\"\n", priv->current_theme));
+   blow_themes (icon_theme);
+-  g_signal_emit (icon_theme, signal_changed, 0);
+-
+-  if (!priv->reset_styles_idle)
+-    priv->reset_styles_idle = 
+-      gdk_threads_add_idle_full (GTK_PRIORITY_RESIZE - 2, 
+-		       reset_styles_idle, icon_theme, NULL);
++  queue_theme_changed (icon_theme);
+ }
+ 
+ static void
+@@ -754,10 +762,10 @@ gtk_icon_theme_finalize (GObject *object)
+   icon_theme = GTK_ICON_THEME (object);
+   priv = icon_theme->priv;
+ 
+-  if (priv->reset_styles_idle)
++  if (priv->theme_changed_idle)
+     {
+-      g_source_remove (priv->reset_styles_idle);
+-      priv->reset_styles_idle = 0;
++      g_source_remove (priv->theme_changed_idle);
++      priv->theme_changed_idle = 0;
+     }
+ 
+   unset_screen (icon_theme);
+@@ -1297,9 +1305,7 @@ ensure_valid_themes (GtkIconTheme *icon_theme)
+       load_themes (icon_theme);
+ 
+       if (was_valid)
+-	{
+-	  g_signal_emit (icon_theme, signal_changed, 0);
+-	}
++	queue_theme_changed (icon_theme);
+     }
+ 
+   priv->loading_themes = FALSE;
+-- 
+1.8.2.1
+
diff --git a/gtk3.spec b/gtk3.spec
index d886686..e975cda 100644
--- a/gtk3.spec
+++ b/gtk3.spec
@@ -10,7 +10,7 @@
 Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X
 Name: gtk3
 Version: 3.6.4
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: LGPLv2+
 Group: System Environment/Libraries
 URL: http://www.gtk.org
@@ -18,6 +18,9 @@ URL: http://www.gtk.org
 Source: http://download.gnome.org/sources/gtk+/3.6/gtk+-%{version}.tar.xz
 Source1: im-cedilla.conf
 
+# upstream fix
+Patch0: 0001-IconTheme-Move-changed-emission-to-an-idle.patch
+
 BuildRequires: gnome-common autoconf automake intltool gettext
 BuildRequires: atk-devel >= %{atk_version}
 BuildRequires: at-spi2-atk-devel
@@ -109,6 +112,7 @@ widget toolkit.
 
 %prep
 %setup -q -n gtk+-%{version}
+%patch0 -p1
 
 %build
 
@@ -244,6 +248,9 @@ gtk-query-immodules-3.0-%{__isa_bits} --update-cache
 %{_datadir}/gtk-doc
 
 %changelog
+* Wed Jun 19 2013 Matthias Clasen <mclasen at redhat.com> - 3.6.4-2
+- Fix icon theme reloading reentrancy issue
+
 * Mon Jan  7 2013 Matthias Clasen <mclasen at redhat.com> - 3.6.4-1
 - Update to 3.6.4
 


More information about the scm-commits mailing list