[gvfs] smb: Improve batching when sending enumerate GFileInfos



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]