user: speed up init_paths a bit
The current init_paths code will attempt to opendir() every single file it finds. This can obviously generated a huge number of syscalls with even a moderately small sysroot that will fail. Since the readdir() call provides the file type in the struct itself, use it. On my system, this prevents over 1000 syscalls from being made at every invocation of a target binary, and I only have a C library installed. Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Riku Voipio <riku.voipio@nokia.com>
This commit is contained in:
parent
737de1d135
commit
2296f194df
28
path.c
28
path.c
@ -38,7 +38,8 @@ static int strneq(const char *s1, unsigned int n, const char *s2)
|
|||||||
return s2[i] == 0;
|
return s2[i] == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pathelem *add_entry(struct pathelem *root, const char *name);
|
static struct pathelem *add_entry(struct pathelem *root, const char *name,
|
||||||
|
unsigned char type);
|
||||||
|
|
||||||
static struct pathelem *new_entry(const char *root,
|
static struct pathelem *new_entry(const char *root,
|
||||||
struct pathelem *parent,
|
struct pathelem *parent,
|
||||||
@ -56,6 +57,15 @@ static struct pathelem *new_entry(const char *root,
|
|||||||
|
|
||||||
#define streq(a,b) (strcmp((a), (b)) == 0)
|
#define streq(a,b) (strcmp((a), (b)) == 0)
|
||||||
|
|
||||||
|
/* Not all systems provide this feature */
|
||||||
|
#if defined(DT_DIR) && defined(DT_UNKNOWN)
|
||||||
|
# define dirent_type(dirent) ((dirent)->d_type)
|
||||||
|
# define is_dir_maybe(type) ((type) == DT_DIR || (type) == DT_UNKNOWN)
|
||||||
|
#else
|
||||||
|
# define dirent_type(dirent) (1)
|
||||||
|
# define is_dir_maybe(type) (type)
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct pathelem *add_dir_maybe(struct pathelem *path)
|
static struct pathelem *add_dir_maybe(struct pathelem *path)
|
||||||
{
|
{
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
@ -65,7 +75,7 @@ static struct pathelem *add_dir_maybe(struct pathelem *path)
|
|||||||
|
|
||||||
while ((dirent = readdir(dir)) != NULL) {
|
while ((dirent = readdir(dir)) != NULL) {
|
||||||
if (!streq(dirent->d_name,".") && !streq(dirent->d_name,"..")){
|
if (!streq(dirent->d_name,".") && !streq(dirent->d_name,"..")){
|
||||||
path = add_entry(path, dirent->d_name);
|
path = add_entry(path, dirent->d_name, dirent_type(dirent));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
@ -73,16 +83,22 @@ static struct pathelem *add_dir_maybe(struct pathelem *path)
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pathelem *add_entry(struct pathelem *root, const char *name)
|
static struct pathelem *add_entry(struct pathelem *root, const char *name,
|
||||||
|
unsigned char type)
|
||||||
{
|
{
|
||||||
|
struct pathelem **e;
|
||||||
|
|
||||||
root->num_entries++;
|
root->num_entries++;
|
||||||
|
|
||||||
root = realloc(root, sizeof(*root)
|
root = realloc(root, sizeof(*root)
|
||||||
+ sizeof(root->entries[0])*root->num_entries);
|
+ sizeof(root->entries[0])*root->num_entries);
|
||||||
|
e = &root->entries[root->num_entries-1];
|
||||||
|
|
||||||
|
*e = new_entry(root->pathname, root, name);
|
||||||
|
if (is_dir_maybe(type)) {
|
||||||
|
*e = add_dir_maybe(*e);
|
||||||
|
}
|
||||||
|
|
||||||
root->entries[root->num_entries-1] = new_entry(root->pathname, root, name);
|
|
||||||
root->entries[root->num_entries-1]
|
|
||||||
= add_dir_maybe(root->entries[root->num_entries-1]);
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user