[gvfs] smb: Improve batching when sending enumerate GFileInfos
- From: Ross Lagerwall <rossl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] smb: Improve batching when sending enumerate GFileInfos
- Date: Wed, 28 May 2014 19:36:56 +0000 (UTC)
commit 5aa709f89433962ea0bbd02401a2f0bb40d66120
Author: Ross Lagerwall <rosslagerwall gmail com>
Date: Tue May 27 23:18:03 2014 +0100
smb: Improve batching when sending enumerate GFileInfos
Instead of creating a list of GFileInfos and sending them when the
entire directory has been read, call g_vfs_job_enumerate_add_info
to send them in batches (default of 50). This simplifies the code
and should reduce the memory usage when enumerating a large directory.
https://bugzilla.gnome.org/show_bug.cgi?id=730856
daemon/gvfsbackendsmb.c | 16 ++++------------
1 files changed, 4 insertions(+), 12 deletions(-)
---
diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c
index af9df90..2e112ef 100644
--- a/daemon/gvfsbackendsmb.c
+++ b/daemon/gvfsbackendsmb.c
@@ -1913,7 +1913,6 @@ do_enumerate (GVfsBackend *backend,
SMBCFILE *dir;
char dirents[1024*4];
struct smbc_dirent *dirp;
- GList *files;
GFileInfo *info;
GString *uri;
int uri_start_len;
@@ -1950,8 +1949,6 @@ do_enumerate (GVfsBackend *backend,
while (TRUE)
{
- files = NULL;
-
res = smbc_getdents (op_backend->smb_context, dir, (struct smbc_dirent *)dirents, sizeof (dirents));
if (res <= 0)
break;
@@ -1980,7 +1977,8 @@ do_enumerate (GVfsBackend *backend,
{
info = g_file_info_new ();
g_file_info_set_name (info, dirp->name);
- files = g_list_prepend (files, info);
+ g_vfs_job_enumerate_add_info (job, info);
+ g_object_unref (info);
}
else
{
@@ -1990,7 +1988,8 @@ do_enumerate (GVfsBackend *backend,
{
info = g_file_info_new ();
set_info_from_stat (op_backend, info, &st, dirp->name, matcher);
- files = g_list_prepend (files, info);
+ g_vfs_job_enumerate_add_info (job, info);
+ g_object_unref (info);
}
}
}
@@ -1999,13 +1998,6 @@ do_enumerate (GVfsBackend *backend,
dirp = (struct smbc_dirent *) (((char *)dirp) + dirlen);
res -= dirlen;
}
-
- if (files)
- {
- files = g_list_reverse (files);
- g_vfs_job_enumerate_add_infos (job, files);
- g_list_free_full (files, g_object_unref);
- }
}
res = smbc_closedir (op_backend->smb_context, dir);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]