diff options
author | Timothy Arceri <t_arceri@yahoo.com.au> | 2013-04-20 21:10:00 +1000 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2013-05-06 16:36:11 +0200 |
commit | 8c5d70c411d3b7f0c0622e0a73567e83b2745249 (patch) | |
tree | 662e345523404768d2caa9aa54f02e198174af47 | |
parent | 238a92496f5ab165b52f90d414379525cb262ee1 (diff) | |
download | gvfs-8c5d70c411d3b7f0c0622e0a73567e83b2745249.tar.gz |
Adds remaining shutdown infrastructure and call from cdda backend.
https://bugzilla.gnome.org/show_bug.cgi?id=511802
-rw-r--r-- | daemon/daemon-main.c | 12 | ||||
-rw-r--r-- | daemon/gvfsbackend.c | 39 | ||||
-rw-r--r-- | daemon/gvfsbackend.h | 1 | ||||
-rw-r--r-- | daemon/gvfsbackendcdda.c | 8 |
4 files changed, 53 insertions, 7 deletions
diff --git a/daemon/daemon-main.c b/daemon/daemon-main.c index de007b09..4b2d5419 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 0c84c150..fc65d825 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 e340cb92..ab7c2da1 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 a8213a87..0d56dbfb 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 |