diff options
author | Ondrej Holy <oholy@redhat.com> | 2014-02-27 18:53:08 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2014-08-09 15:41:23 +0200 |
commit | be4d7fa3b44a8c195bf6e19cf2a44ff9440ffc07 (patch) | |
tree | b65532e0df12baa1969dc3a7b89acc99bbe81558 /daemon/gvfsdaemon.c | |
parent | 0aafc320c4278ccb0469d2aea981ab03db3cbfab (diff) | |
download | gvfs-be4d7fa3b44a8c195bf6e19cf2a44ff9440ffc07.tar.gz |
daemon: consider all jobs excepting unmount as blocking processes
User can wait to finish all jobs (not only those with opened channel)
before unmount to avoid potencial crashes.
https://bugzilla.gnome.org/show_bug.cgi?id=710986
Diffstat (limited to 'daemon/gvfsdaemon.c')
-rw-r--r-- | daemon/gvfsdaemon.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/daemon/gvfsdaemon.c b/daemon/gvfsdaemon.c index 3018e34c..4e624b81 100644 --- a/daemon/gvfsdaemon.c +++ b/daemon/gvfsdaemon.c @@ -41,6 +41,7 @@ #include <gvfsjobmount.h> #include <gvfsjobopenforread.h> #include <gvfsjobopenforwrite.h> +#include <gvfsjobunmount.h> enum { PROP_0 @@ -1030,7 +1031,9 @@ g_vfs_daemon_initiate_mount (GVfsDaemon *daemon, * @daemon: A #GVfsDaemon. * * Gets all processes that blocks unmounting, e.g. processes with open - * file handles. + * file handles. Returned array could be empty in spite of + * g_vfs_daemon_has_blocking_processes returns TRUE, because for jobs without + * channel we can't get #GPid. * * Returns: An array of #GPid. Free with g_array_unref(). */ @@ -1054,6 +1057,34 @@ g_vfs_daemon_get_blocking_processes (GVfsDaemon *daemon) return processes; } +/** + * g_vfs_daemon_has_blocking_processes: + * @daemon: A #GVfsDaemon. + * + * Determines if there are any jobs blocking unmounting, all jobs excepting + * unmount job. + * + * Returns: TRUE if there are any blocking processes, or FALSE otherwise. + */ +gboolean +g_vfs_daemon_has_blocking_processes (GVfsDaemon *daemon) +{ + GList *l; + + g_mutex_lock (&daemon->lock); + for (l = daemon->jobs; l != NULL; l = l->next) + { + if (!G_VFS_IS_JOB_UNMOUNT (l->data)) + { + g_mutex_unlock (&daemon->lock); + return TRUE; + } + } + g_mutex_unlock (&daemon->lock); + + return FALSE; +} + void g_vfs_daemon_run_job_in_thread (GVfsDaemon *daemon, GVfsJob *job) |