summaryrefslogtreecommitdiff
path: root/daemon/gvfsdaemon.c
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2014-02-27 18:53:08 +0100
committerOndrej Holy <oholy@redhat.com>2014-08-09 15:41:23 +0200
commitbe4d7fa3b44a8c195bf6e19cf2a44ff9440ffc07 (patch)
treeb65532e0df12baa1969dc3a7b89acc99bbe81558 /daemon/gvfsdaemon.c
parent0aafc320c4278ccb0469d2aea981ab03db3cbfab (diff)
downloadgvfs-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.c33
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)