diff options
author | Ondrej Holy <oholy@redhat.com> | 2017-01-04 10:31:08 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2017-06-06 09:11:24 +0200 |
commit | ceb0daa48bd6b5144873a4984572c2781fa4a7ac (patch) | |
tree | 3ef72406e6e921caa0ba7441b6b08c2d8ec6708e /daemon/mount.c | |
parent | 29872122c87623c77a85869e309f79a50aed8e09 (diff) | |
download | gvfs-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.c | 43 |
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); |