glib r7957 - trunk/gio



Author: alexl
Date: Wed Mar  4 10:45:10 2009
New Revision: 7957
URL: http://svn.gnome.org/viewvc/glib?rev=7957&view=rev

Log:
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




Modified:
   trunk/gio/ChangeLog
   trunk/gio/gunionvolumemonitor.c
   trunk/gio/gunixvolumemonitor.c

Modified: trunk/gio/gunionvolumemonitor.c
==============================================================================
--- trunk/gio/gunionvolumemonitor.c	(original)
+++ trunk/gio/gunionvolumemonitor.c	Wed Mar  4 10:45:10 2009
@@ -80,11 +80,20 @@
 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);

Modified: trunk/gio/gunixvolumemonitor.c
==============================================================================
--- trunk/gio/gunixvolumemonitor.c	(original)
+++ trunk/gio/gunixvolumemonitor.c	Wed Mar  4 10:45:10 2009
@@ -90,6 +90,23 @@
   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 @@
   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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]