count_files: sort directory in inode order before statting
authorStewart Smith <stewart@flamingspork.com>
Wed, 18 Nov 2009 02:22:20 +0000 (13:22 +1100)
committerCarl Worth <cworth@cworth.org>
Wed, 18 Nov 2009 21:31:57 +0000 (22:31 +0100)
Carl says: This has similar performance benefits as the previous
patch, and I fixed similar style issues here as well, (including
missing more of a commit message than the one-line summary).

notmuch-new.c

index 127c9db11e11dc74b0c37a7d489522982f3fcdee..8b3195984680fd948b1bae764ff1cf6068db9f83 100644 (file)
@@ -309,37 +309,25 @@ 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;
+    int n_entries = scandir (path, &namelist, 0, ino_cmp);
+    int i = 0;
 
-    dir = opendir (path);
-
-    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);
-
     while (!interrupted) {
-       err = readdir_r (dir, entry, &e);
-       if (err) {
-           fprintf (stderr, "Error reading directory: %s\n",
-                    strerror (errno));
-           free (entry);
-           goto DONE;
-       }
-
-       if (e == NULL)
+        if (i == n_entries)
            break;
 
+        entry= namelist[i++];
+
        /* Ignore special directories to avoid infinite recursion.
         * Also ignore the .notmuch directory.
         */
@@ -377,8 +365,8 @@ count_files (const char *path, int *count)
   DONE:
     if (entry)
        free (entry);
-
-    closedir (dir);
+    if (namelist)
+        free (namelist);
 }
 
 int