Re: Bug#378346: libgail crashes on alpha
forwarded 378346 http://bugzilla.gnome.org/show_bug.cgi?id=325759
tags = 378346 fixed-upstream patch
thanks
On Sun, Nov 05, 2006 at 03:49:01AM -0800, Steve Langasek wrote:
> On Mon, Oct 16, 2006 at 04:42:30PM +0200, Loïc Minier wrote:
> > I suggest you install libgail-dbg, and libgtk2.0-0-dbg to get a nicer
> > backtrace. Could you try rebuilding against Gtk 2.10 / Gail 1.9 from
> > experimental? This would permit isolating the fix and perhaps
> > backporting it if it's fixed in 1.9.
> Installing gtk 2.10 + gail 1.9 (and recompiling gtkhml3.8 against the new
> libgail) fixes the crash in my test case.
And, here's the isolated fix for the bug.
Thanks,
--
Steve Langasek Give me a lever long enough and a Free OS
Debian Developer to set it on, and I can move the world.
vorlon@debian.org http://www.debian.org/
diff -u gail-1.8.11/debian/changelog gail-1.8.11/debian/changelog
--- gail-1.8.11/debian/changelog
+++ gail-1.8.11/debian/changelog
@@ -1,3 +1,12 @@
+gail (1.8.11-2.1) unstable; urgency=high
+
+ * Non-maintainer upload.
+ * High-urgency upload for RC bugfix.
+ * Backport patch from gail 1.9.3 to fix upstream bug #325759;
+ closes: #378346.
+
+ -- Steve Langasek <vorlon@debian.org> Sun, 5 Nov 2006 05:31:59 -0800
+
gail (1.8.11-2) unstable; urgency=low
* Bump build-deps to libgtk2.0-dev >= 2.8.17-1, liborbit2-dev >= 1:2.14.0-1,
only in patch2:
unchanged:
--- gail-1.8.11.orig/gail/gailtreeview.c
+++ gail-1.8.11/gail/gailtreeview.c
@@ -336,6 +336,7 @@
GList** list,
gboolean live_only);
static AtkObject * get_header_from_column (GtkTreeViewColumn *tv_col);
+static gboolean idle_garbage_collect_cell_data (gpointer data);
static gboolean garbage_collect_cell_data (gpointer data);
static GailWidgetClass *parent_class = NULL;
@@ -3489,7 +3490,7 @@
if (!gailview->garbage_collection_pending) {
gailview->garbage_collection_pending = TRUE;
gailview->idle_garbage_collect_id =
- g_idle_add (garbage_collect_cell_data, gailview);
+ g_idle_add (idle_garbage_collect_cell_data, gailview);
}
}
}
@@ -3595,6 +3596,32 @@
}
static gboolean
+idle_garbage_collect_cell_data (gpointer data)
+{
+ GailTreeView *tree_view;
+
+ GDK_THREADS_ENTER ();
+ g_assert (GAIL_IS_TREE_VIEW (data));
+ tree_view = (GailTreeView *)data;
+
+ /* this is the idle handler (only one instance allowed), so
+ * we can safely delete it.
+ */
+ tree_view->garbage_collection_pending = FALSE;
+ tree_view->idle_garbage_collect_id = 0;
+
+ tree_view->garbage_collection_pending = garbage_collect_cell_data (data);
+
+ GDK_THREADS_LEAVE ();
+
+ /* N.B.: if for some reason another handler has re-enterantly been queued
+ * while this handler was being serviced, it has its own gsource, therefore this handler
+ * should always return FALSE.
+ */
+ return FALSE;
+}
+
+static gboolean
garbage_collect_cell_data (gpointer data)
{
GailTreeView *tree_view;
@@ -3606,7 +3633,11 @@
temp_list = g_list_copy (tree_view->cell_data);
tree_view->garbage_collection_pending = FALSE;
- tree_view->idle_garbage_collect_id = 0;
+ if (tree_view->idle_garbage_collect_id != 0)
+ {
+ g_source_remove (tree_view->idle_garbage_collect_id);
+ tree_view->idle_garbage_collect_id = 0;
+ }
/* Must loop through them all */
while (temp_list != NULL)
@@ -4020,7 +4051,7 @@
if (!cell_info->view->garbage_collection_pending) {
cell_info->view->garbage_collection_pending = TRUE;
cell_info->view->idle_garbage_collect_id =
- g_idle_add (garbage_collect_cell_data, cell_info->view);
+ g_idle_add (idle_garbage_collect_cell_data, cell_info->view);
}
}
}
Reply to: