[gvfs] Adds remaining shutdown infrastructure and call from cdda backend.



commit 8c5d70c411d3b7f0c0622e0a73567e83b2745249
Author: Timothy Arceri <t_arceri yahoo com au>
Date:   Sat Apr 20 21:10:00 2013 +1000

    Adds remaining shutdown infrastructure and call from cdda backend.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=511802

 daemon/daemon-main.c     |   12 +++++++++++-
 daemon/gvfsbackend.c     |   39 +++++++++++++++++++++++++++++++++++++++
 daemon/gvfsbackend.h     |    1 +
 daemon/gvfsbackendcdda.c |    8 ++------
 4 files changed, 53 insertions(+), 7 deletions(-)
---
diff --git a/daemon/daemon-main.c b/daemon/daemon-main.c
index de007b0..4b2d541 100644
--- a/daemon/daemon-main.c
+++ b/daemon/daemon-main.c
@@ -313,6 +313,14 @@ on_name_lost (GDBusConnection *connection,
 }
 
 static void
+daemon_shutdown (GVfsDaemon *daemon,
+                GMainLoop  *loop)
+{
+  if (g_main_loop_is_running (loop))
+    g_main_loop_quit (loop);
+}
+
+static void
 on_name_acquired (GDBusConnection *connection,
                   const gchar     *name,
                   gpointer         user_data)
@@ -329,6 +337,8 @@ on_name_acquired (GDBusConnection *connection,
     }
 
   g_vfs_daemon_set_max_threads (data->daemon, data->max_job_threads);
+  g_signal_connect (data->daemon, "shutdown",
+                   G_CALLBACK (daemon_shutdown), loop);
 
   send_spawned (TRUE, NULL, 0, spawned_succeeded_cb, data);
 }
@@ -391,7 +401,7 @@ daemon_main (int argc,
     {
       g_idle_add (do_name_acquired, data);
     }
-  
+
   g_main_loop_run (loop);
   
   g_clear_object (&data->daemon);
diff --git a/daemon/gvfsbackend.c b/daemon/gvfsbackend.c
index 0c84c15..fc65d82 100644
--- a/daemon/gvfsbackend.c
+++ b/daemon/gvfsbackend.c
@@ -994,6 +994,45 @@ g_vfs_backend_unmount_with_operation (GVfsBackend        *backend,
 
 }
 
+static void
+forced_unregister_mount_callback (GVfsDBusMountTracker *proxy,
+                                 GAsyncResult *res,
+                                 gpointer user_data)
+{
+  GVfsDaemon *daemon;
+  GVfsBackend *backend;
+  GError *error = NULL;
+
+  g_return_if_fail (G_VFS_IS_BACKEND (user_data));
+
+  g_debug ("forced_unregister_mount_callback\n");
+  if (! gvfs_dbus_mount_tracker_call_unregister_mount_finish (proxy,
+                                                              res,
+                                                              &error))
+    {
+      g_dbus_error_strip_remote_error (error);
+      g_warning ("Error unregistering mount: %s (%s, %d)\n",
+                  error->message, g_quark_to_string (error->domain), error->code);
+      g_error_free (error);
+    }
+
+  /* Unlink job source from daemon */
+  backend = G_VFS_BACKEND (user_data);
+  daemon = g_vfs_backend_get_daemon (backend);
+  g_vfs_daemon_close_active_channels (daemon, backend);
+  g_vfs_job_source_closed (G_VFS_JOB_SOURCE (backend));
+
+}
+
+void
+g_vfs_backend_force_unmount (GVfsBackend *backend)
+{
+  g_vfs_backend_set_block_requests (backend);
+  g_vfs_backend_unregister_mount (backend,
+                                 (GAsyncReadyCallback) forced_unregister_mount_callback,
+                                 backend);
+}
+
 gboolean
 g_vfs_backend_has_blocking_processes (GVfsBackend  *backend)
 {
diff --git a/daemon/gvfsbackend.h b/daemon/gvfsbackend.h
index e340cb9..ab7c2da 100644
--- a/daemon/gvfsbackend.h
+++ b/daemon/gvfsbackend.h
@@ -496,6 +496,7 @@ const char *g_vfs_backend_get_default_location           (GVfsBackend        *ba
 GMountSpec *g_vfs_backend_get_mount_spec                 (GVfsBackend        *backend);
 GVfsDaemon *g_vfs_backend_get_daemon                     (GVfsBackend        *backend);
 gboolean    g_vfs_backend_is_mounted                     (GVfsBackend        *backend);
+void        g_vfs_backend_force_unmount                  (GVfsBackend        *backend);
 
 void        g_vfs_backend_add_auto_info                  (GVfsBackend           *backend,
                                                          GFileAttributeMatcher *matcher,
diff --git a/daemon/gvfsbackendcdda.c b/daemon/gvfsbackendcdda.c
index a8213a8..0d56dbf 100644
--- a/daemon/gvfsbackendcdda.c
+++ b/daemon/gvfsbackendcdda.c
@@ -237,9 +237,7 @@ on_uevent (GUdevClient *client, gchar *action, GUdevDevice *device, gpointer use
   if (strcmp (action, "remove") == 0 || (strcmp (action, "change") == 0 &&
       g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA") != 1))
     {
-      /*g_warning ("we have been removed!");*/
-      /* TODO: need a cleaner way to force unmount ourselves */
-      exit (1);
+      g_vfs_backend_force_unmount (cdda_backend);
     }
 }
 
@@ -292,9 +290,7 @@ _hal_device_removed (LibHalContext *hal_ctx, const char *udi)
 
   if (cdda_backend->hal_udi != NULL && strcmp (udi, cdda_backend->hal_udi) == 0)
     {
-      /*g_warning ("we have been removed!");*/
-      /* TODO: need a cleaner way to force unmount ourselves */
-      exit (1);
+      g_vfs_backend_force_unmount (cdda_backend);
     }
 }
 #endif


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