Hello.

I'm trying to debug issue with recent glib (2.43.4) on OpenIndiana.
The problems started after updating from glib 2.28 to glib 2.43. Sometimes different applications (for example, thunderbird) dies in g_type_check_instance_cast.

I've investigated Thunderbird crash and found the following.
TB creates several G_FILE_MONITOR objects . Then dispose some of them. Later it can register and emit signals to already disposed monitors.

I used the following patch to log some debug info:

diff -ur glib-2.43.4-fm-debug/gio/fen/gfenfilemonitor.c glib-2.43.4/gio/fen/gfenfilemonitor.c --- glib-2.43.4-fm-debug/gio/fen/gfenfilemonitor.c 2015-05-19 11:55:07.948864217 +0300 +++ glib-2.43.4/gio/fen/gfenfilemonitor.c 2015-05-19 11:56:20.256640332 +0300
@@ -128,6 +128,7 @@
 {
     GFenFileMonitor *self = G_FEN_FILE_MONITOR (monitor);

+    printf("Canceling monitor %X\n",monitor);
     if (self->enabled) {
         fen_remove (G_LOCAL_FILE_MONITOR (self)->filename, self, FALSE);
         self->enabled = FALSE;
diff -ur glib-2.43.4-fm-debug/gio/gfilemonitor.c glib-2.43.4/gio/gfilemonitor.c
--- glib-2.43.4/gio/gfilemonitor.c.~1~  2014-12-20 00:49:48.000000000 +0300
+++ glib-2.43.4/gio/gfilemonitor.c      2015-05-19 16:18:44.293651778 +0300
@@ -196,8 +196,11 @@
   monitor = G_FILE_MONITOR (object);
   priv = monitor->priv;

+  printf("Disposing monitor %x\n", monitor);
+
   if (priv->pending_file_change_source)
     {
+      printf("Clearing pending file changes on monitor %x\n", monitor);
       g_source_destroy (priv->pending_file_change_source);
       g_source_unref (priv->pending_file_change_source);
       priv->pending_file_change_source = NULL;
@@ -278,6 +281,7 @@
 static void
 g_file_monitor_init (GFileMonitor *monitor)
 {
+  printf("Initializing monitor %x\n", monitor);
   monitor->priv = g_file_monitor_get_instance_private (monitor);
   monitor->priv->rate_limit_msec = DEFAULT_RATE_LIMIT_MSECS;
monitor->priv->rate_limiter = g_hash_table_new_full (g_file_hash, (GEqualFunc)g_file_equal,
@@ -383,9 +387,12 @@
 static gboolean
 emit_cb (gpointer data)
 {
-  GFileMonitor *monitor = G_FILE_MONITOR (data);
+  GFileMonitor *monitor;
   GSList *pending, *iter;

+  printf("emit_cb: data=%x\n",data);
+  monitor = G_FILE_MONITOR (data);
+  printf("after calling G_FILE_MONITOR(%x)\n",monitor);
   g_mutex_lock (&monitor->priv->mutex);
   pending = g_slist_reverse (monitor->priv->pending_file_changes);
   monitor->priv->pending_file_changes = NULL;
@@ -442,6 +449,7 @@
       /* We don't ref monitor here - instead dispose will free any
        * pending idles.
        */
+      printf("Setting callback on monitor %x\n", monitor);
       g_source_set_callback (source, emit_cb, monitor, NULL);
       g_source_set_name (source, "[gio] emit_cb");
       g_source_attach (source, monitor->priv->context);

And I was able to get the following log before crash:

$ grep a69c0d8 /tmp/log.1
Initializing monitor a69c0d8
Setting callback on monitor a69c0d8
emit_cb: data=a69c0d8
after calling G_FILE_MONITOR(a69c0d8)
Disposing monitor a69c0d8
Setting callback on monitor a69c0d8
emit_cb: data=a69c0d8

Here the program crashed.
So, we see that emit_in_idle() was called after entering to g_file_monitor_dispose() function, which if I understand this correctly lead to crash. Perhaps, some additional handling is necessary in g_file_monitor_dispose() so that we don't try to emit signal to "disposing" object ? Do you have some thoughts on how to debug further and fix this issue?





--
С уважением,
Александр Пыхалов,
программист отдела телекоммуникационной инфраструктуры
управления информационно-коммуникационной инфраструктуры ЮФУ
_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-devel-list

Reply via email to