Bug 573970 – crash in gunixvolumemonitor:update_mounts when unmounting
authorAlexander Larsson <alexl@redhat.com>
Wed, 4 Mar 2009 10:45:10 +0000 (10:45 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Wed, 4 Mar 2009 10:45:10 +0000 (10:45 +0000)
2009-03-04  Alexander Larsson  <alexl@redhat.com>

Bug 573970 – crash in gunixvolumemonitor:update_mounts when unmounting

        * gunionvolumemonitor.c:
        (g_union_volume_monitor_dispose):
Run dispose on child monitors when disposing.

        * gunixvolumemonitor.c:
Remove all volumes and mount on dispose to avoid circular
dependencies not freeing the monitor

svn path=/trunk/; revision=7957

gio/ChangeLog
gio/gunionvolumemonitor.c
gio/gunixvolumemonitor.c

index 594f71e..6df6bc2 100644 (file)
@@ -1,3 +1,15 @@
+2009-03-04  Alexander Larsson  <alexl@redhat.com>
+
+       Bug 573970 – crash in gunixvolumemonitor:update_mounts when unmounting
+
+        * gunionvolumemonitor.c:
+        (g_union_volume_monitor_dispose):
+       Run dispose on child monitors when disposing.
+
+        * gunixvolumemonitor.c:
+       Remove all volumes and mount on dispose to avoid circular
+       dependencies not freeing the monitor
+
 2009-03-03  Alexander Larsson  <alexl@redhat.com>
 
        Bug 561172 – gnome-open fails on local URIs with anchors
index 4115c34..12ef95c 100644 (file)
@@ -80,11 +80,20 @@ static void
 g_union_volume_monitor_dispose (GObject *object)
 {
   GUnionVolumeMonitor *monitor;
-  
+  GVolumeMonitor *child_monitor;
+  GList *l;
+
   monitor = G_UNION_VOLUME_MONITOR (object);
 
   g_static_rec_mutex_lock (&the_volume_monitor_mutex);
   the_volume_monitor = NULL;
+
+  for (l = monitor->monitors; l != NULL; l = l->next)
+    {
+      child_monitor = l->data;
+      g_object_run_dispose (G_OBJECT (child_monitor));
+    }
+  
   g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
 
   G_OBJECT_CLASS (g_union_volume_monitor_parent_class)->dispose (object);
index 54f1017..7592ca8 100644 (file)
@@ -90,6 +90,23 @@ g_unix_volume_monitor_finalize (GObject *object)
   G_OBJECT_CLASS (g_unix_volume_monitor_parent_class)->finalize (object);
 }
 
+static void
+g_unix_volume_monitor_dispose (GObject *object)
+{
+  GUnixVolumeMonitor *monitor;
+
+  monitor = G_UNIX_VOLUME_MONITOR (object);
+  g_list_foreach (monitor->volumes, (GFunc)g_object_unref, NULL);
+  g_list_free (monitor->volumes);
+  monitor->volumes = NULL;
+  
+  g_list_foreach (monitor->mounts, (GFunc)g_object_unref, NULL);
+  g_list_free (monitor->mounts);
+  monitor->mounts = NULL;
+  
+  G_OBJECT_CLASS (g_unix_volume_monitor_parent_class)->dispose (object);
+}
+
 static GList *
 get_mounts (GVolumeMonitor *volume_monitor)
 {
@@ -170,6 +187,7 @@ g_unix_volume_monitor_class_init (GUnixVolumeMonitorClass *klass)
   GNativeVolumeMonitorClass *native_class = G_NATIVE_VOLUME_MONITOR_CLASS (klass);
   
   gobject_class->finalize = g_unix_volume_monitor_finalize;
+  gobject_class->dispose = g_unix_volume_monitor_dispose;
 
   monitor_class->get_mounts = get_mounts;
   monitor_class->get_volumes = get_volumes;