aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-new.c
diff options
context:
space:
mode:
authorGravatar Stewart Smith <stewart@flamingspork.com>2009-11-18 13:22:20 +1100
committerGravatar Carl Worth <cworth@cworth.org>2009-11-18 22:31:57 +0100
commitfca070f8ce72ac424a6494d9cf2763852f8b219c (patch)
treedb3afed3010629134550c46ecda414fda844c863 /notmuch-new.c
parent22759fb27995a8bb1c702e68fd12aee5f40da143 (diff)
count_files: sort directory in inode order before statting
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).
Diffstat (limited to 'notmuch-new.c')
-rw-r--r--notmuch-new.c32
1 files changed, 10 insertions, 22 deletions
diff --git a/notmuch-new.c b/notmuch-new.c
index 127c9db1..8b319598 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -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