Bug 573970 – crash in gunixvolumemonitor:update_mounts when unmounting

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
This commit is contained in:
Alexander Larsson 2009-03-04 10:45:10 +00:00 committed by Alexander Larsson
parent 011901da58
commit 73477419e8
3 changed files with 40 additions and 1 deletions

View 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> 2009-03-03 Alexander Larsson <alexl@redhat.com>
Bug 561172 gnome-open fails on local URIs with anchors Bug 561172 gnome-open fails on local URIs with anchors

View File

@ -80,11 +80,20 @@ static void
g_union_volume_monitor_dispose (GObject *object) g_union_volume_monitor_dispose (GObject *object)
{ {
GUnionVolumeMonitor *monitor; GUnionVolumeMonitor *monitor;
GVolumeMonitor *child_monitor;
GList *l;
monitor = G_UNION_VOLUME_MONITOR (object); monitor = G_UNION_VOLUME_MONITOR (object);
g_static_rec_mutex_lock (&the_volume_monitor_mutex); g_static_rec_mutex_lock (&the_volume_monitor_mutex);
the_volume_monitor = NULL; 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_static_rec_mutex_unlock (&the_volume_monitor_mutex);
G_OBJECT_CLASS (g_union_volume_monitor_parent_class)->dispose (object); G_OBJECT_CLASS (g_union_volume_monitor_parent_class)->dispose (object);

View File

@ -90,6 +90,23 @@ g_unix_volume_monitor_finalize (GObject *object)
G_OBJECT_CLASS (g_unix_volume_monitor_parent_class)->finalize (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 * static GList *
get_mounts (GVolumeMonitor *volume_monitor) 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); GNativeVolumeMonitorClass *native_class = G_NATIVE_VOLUME_MONITOR_CLASS (klass);
gobject_class->finalize = g_unix_volume_monitor_finalize; 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_mounts = get_mounts;
monitor_class->get_volumes = get_volumes; monitor_class->get_volumes = get_volumes;