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).
This commit is contained in:
Stewart Smith 2009-11-18 13:22:20 +11:00 committed by Carl Worth
parent 22759fb279
commit fca070f8ce

View file

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