[glib/glib-2-56: 2/3] gio-tool: Hold GVolumeMonitor reference during operations



commit 2c1aee1963700b65dc938519c0aaeee731e2aa8b
Author: Ondrej Holy <oholy redhat com>
Date:   Thu Aug 2 11:35:48 2018 +0200

    gio-tool: Hold GVolumeMonitor reference during operations
    
    Releasing GVolumeMonitor before g_volume_mount finish cause that
    g_volume_get_mount returns NULL, because the mount is not correctly
    propagated to the volume.
    
    (Backported from commit 88b8ebb5dde0512fd1e098efe4c217111876d252 with
    minor merge conflicts.)
    
    https://gitlab.gnome.org/GNOME/glib/issues/1458

 gio/gio-tool-mount.c | 23 ++++-------------------
 1 file changed, 4 insertions(+), 19 deletions(-)
---
diff --git a/gio/gio-tool-mount.c b/gio/gio-tool-mount.c
index 9522713e9..1f51d7c77 100644
--- a/gio/gio-tool-mount.c
+++ b/gio/gio-tool-mount.c
@@ -39,6 +39,7 @@ typedef enum {
 
 static int outstanding_mounts = 0;
 static GMainLoop *main_loop;
+static GVolumeMonitor *volume_monitor;
 
 static gboolean mount_mountable = FALSE;
 static gboolean mount_unmount = FALSE;
@@ -813,11 +814,8 @@ list_drives (GList *drives,
 static void
 list_monitor_items (void)
 {
-  GVolumeMonitor *volume_monitor;
   GList *drives, *volumes, *mounts;
 
-  volume_monitor = g_volume_monitor_get();
-
   /* populate gvfs network mounts */
   iterate_gmain();
 
@@ -832,19 +830,14 @@ list_monitor_items (void)
   mounts = g_volume_monitor_get_mounts (volume_monitor);
   list_mounts (mounts, 0, TRUE);
   g_list_free_full (mounts, g_object_unref);
-
-  g_object_unref (volume_monitor);
 }
 
 static void
 unmount_all_with_scheme (const char *scheme)
 {
-  GVolumeMonitor *volume_monitor;
   GList *mounts;
   GList *l;
 
-  volume_monitor = g_volume_monitor_get();
-
   /* populate gvfs network mounts */
   iterate_gmain();
 
@@ -860,8 +853,6 @@ unmount_all_with_scheme (const char *scheme)
     g_object_unref (root);
   }
   g_list_free_full (mounts, g_object_unref);
-
-  g_object_unref (volume_monitor);
 }
 
 static void
@@ -912,12 +903,9 @@ mount_with_device_file_cb (GObject *object,
 static void
 mount_with_device_file (const char *device_file)
 {
-  GVolumeMonitor *volume_monitor;
   GList *volumes;
   GList *l;
 
-  volume_monitor = g_volume_monitor_get();
-
   volumes = g_volume_monitor_get_volumes (volume_monitor);
   for (l = volumes; l != NULL; l = l->next)
     {
@@ -950,8 +938,6 @@ mount_with_device_file (const char *device_file)
       print_error ("%s: %s", device_file, _("No volume for device file"));
       success = FALSE;
     }
-
-  g_object_unref (volume_monitor);
 }
 
 static void
@@ -1105,10 +1091,6 @@ monitor_drive_eject_button (GVolumeMonitor *volume_monitor, GDrive *drive)
 static void
 monitor (void)
 {
-  GVolumeMonitor *volume_monitor;
-
-  volume_monitor = g_volume_monitor_get ();
-
   g_signal_connect (volume_monitor, "mount-added", (GCallback) monitor_mount_added, NULL);
   g_signal_connect (volume_monitor, "mount-removed", (GCallback) monitor_mount_removed, NULL);
   g_signal_connect (volume_monitor, "mount-changed", (GCallback) monitor_mount_changed, NULL);
@@ -1163,6 +1145,7 @@ handle_mount (int argc, char *argv[], gboolean do_help)
   g_option_context_free (context);
 
   main_loop = g_main_loop_new (NULL, FALSE);
+  volume_monitor = g_volume_monitor_get ();
 
   if (mount_list)
     list_monitor_items ();
@@ -1190,5 +1173,7 @@ handle_mount (int argc, char *argv[], gboolean do_help)
   if (outstanding_mounts > 0)
     g_main_loop_run (main_loop);
 
+  g_object_unref (volume_monitor);
+
   return success ? 0 : 2;
 }


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