mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-28 13:44:12 +01:00
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:
parent
22759fb279
commit
fca070f8ce
1 changed files with 10 additions and 22 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue