summaryrefslogtreecommitdiff
path: root/daemon/mount.c
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2017-01-04 10:31:08 +0100
committerOndrej Holy <oholy@redhat.com>2017-06-06 09:11:24 +0200
commitceb0daa48bd6b5144873a4984572c2781fa4a7ac (patch)
tree3ef72406e6e921caa0ba7441b6b08c2d8ec6708e /daemon/mount.c
parent29872122c87623c77a85869e309f79a50aed8e09 (diff)
downloadgvfs-ceb0daa48bd6b5144873a4984572c2781fa4a7ac.tar.gz
Do not sent user invisible mounts if not needed
g_volume_monitor_get() might be really slow if there is too many mounts, because the list of the mounts is send over D-Bus. It can simply happen due to user invisible mounts, e.g. http. User invisible mounts are ignored by the volume monitor, so it is useless to send them over D-Bus. Improve the D-Bus API and don't send the user invisible mounts if it is not needed. https://bugzilla.gnome.org/show_bug.cgi?id=775600
Diffstat (limited to 'daemon/mount.c')
-rw-r--r--daemon/mount.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/daemon/mount.c b/daemon/mount.c
index 2e2f74b0..5bab324d 100644
--- a/daemon/mount.c
+++ b/daemon/mount.c
@@ -820,21 +820,51 @@ handle_lookup_mount_by_fuse_path (GVfsDBusMountTracker *object,
return TRUE;
}
+static void
+build_mounts_array (GVariantBuilder *mounts_array,
+ gboolean user_visible_only)
+{
+ GList *l;
+ VfsMount *mount;
+
+ g_variant_builder_init (mounts_array, G_VARIANT_TYPE (VFS_MOUNT_ARRAY_DBUS_STRUCT_TYPE));
+ for (l = mounts; l != NULL; l = l->next)
+ {
+ mount = l->data;
+
+ if (!user_visible_only || mount->user_visible)
+ g_variant_builder_add_value (mounts_array, vfs_mount_to_dbus (mount));
+ }
+}
+
static gboolean
handle_list_mounts (GVfsDBusMountTracker *object,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
- GList *l;
GVariantBuilder mounts_array;
- g_variant_builder_init (&mounts_array, G_VARIANT_TYPE (VFS_MOUNT_ARRAY_DBUS_STRUCT_TYPE));
- for (l = mounts; l != NULL; l = l->next)
- g_variant_builder_add_value (&mounts_array, vfs_mount_to_dbus (l->data));
-
+ build_mounts_array (&mounts_array, FALSE);
+
gvfs_dbus_mount_tracker_complete_list_mounts (object, invocation,
g_variant_builder_end (&mounts_array));
-
+
+ return TRUE;
+}
+
+static gboolean
+handle_list_mounts2 (GVfsDBusMountTracker *object,
+ GDBusMethodInvocation *invocation,
+ gboolean arg_user_visible_only,
+ gpointer user_data)
+{
+ GVariantBuilder mounts_array;
+
+ build_mounts_array (&mounts_array, arg_user_visible_only);
+
+ gvfs_dbus_mount_tracker_complete_list_mounts2 (object, invocation,
+ g_variant_builder_end (&mounts_array));
+
return TRUE;
}
@@ -1056,6 +1086,7 @@ mount_init (void)
g_signal_connect (mount_tracker, "handle-lookup-mount", G_CALLBACK (handle_lookup_mount), NULL);
g_signal_connect (mount_tracker, "handle-lookup-mount-by-fuse-path", G_CALLBACK (handle_lookup_mount_by_fuse_path), NULL);
g_signal_connect (mount_tracker, "handle-list-mounts", G_CALLBACK (handle_list_mounts), NULL);
+ g_signal_connect (mount_tracker, "handle-list-mounts2", G_CALLBACK (handle_list_mounts2), NULL);
g_signal_connect (mount_tracker, "handle-list-mountable-info", G_CALLBACK (handle_list_mountable_info), NULL);
g_signal_connect (mount_tracker, "handle-list-mount-types", G_CALLBACK (handle_list_mount_types), NULL);
g_signal_connect (mount_tracker, "handle-unregister-mount", G_CALLBACK (handle_unregister_mount), NULL);