[notmuch] [PATCH] count_files: sort directory in inode order before statting

Stewart Smith stewart at flamingspork.com
Tue Nov 17 18:22:20 PST 2009


---
 notmuch-new.c |   30 ++++++++++--------------------
 1 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/notmuch-new.c b/notmuch-new.c
index 11fad8c..c5f841a 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -308,36 +308,26 @@ add_files (notmuch_database_t *notmuch,
 static void
 count_files (const char *path, int *count)
 {
-    DIR *dir;
-    struct dirent *e, *entry = NULL;
-    int entry_length;
-    int err;
+    struct dirent *entry = NULL;
     char *next;
     struct stat st;
+    struct dirent **namelist = NULL;
 
-    dir = opendir (path);
+    int n_entries= scandir(path, &namelist, 0, ino_cmp);
 
-    if (dir == NULL) {
+    if (n_entries == -1) {
 	fprintf (stderr, "Warning: failed to open directory %s: %s\n",
 		 path, strerror (errno));
 	goto DONE;
     }
 
-    entry_length = offsetof (struct dirent, d_name) +
-	pathconf (path, _PC_NAME_MAX) + 1;
-    entry = malloc (entry_length);
+    int i=0;
 
     while (!interrupted) {
-	err = readdir_r (dir, entry, &e);
-	if (err) {
-	    fprintf (stderr, "Error reading directory: %s\n",
-		     strerror (errno));
-	    free (entry);
-	    goto DONE;
-	}
+        if (i == n_entries)
+            break;
 
-	if (e == NULL)
-	    break;
+        entry= namelist[i++];
 
 	/* Ignore special directories to avoid infinite recursion.
 	 * Also ignore the .notmuch directory.
@@ -376,8 +366,8 @@ count_files (const char *path, int *count)
   DONE:
     if (entry)
 	free (entry);
-
-    closedir (dir);
+    if (namelist)
+        free (namelist);
 }
 
 int
-- 
1.6.3.3



More information about the notmuch mailing list