summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-03 04:13:12 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-03 04:13:12 +0000
commit76857f8ee825e6896248264d866f8fa5a717057e (patch)
tree73e8a0e83686395d9db50ffb5fb9baaf803afb4c /dir.c
parent2a5c20acaf3f9cc695c91f6a9d6006801e432cc6 (diff)
dir.c: reduce syscalls
* dir.c (glob_helper): utilize d_type even if no recursive pattern, to reduce stat/lstat syscalls in subsequent glob_helper. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59481 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/dir.c b/dir.c
index f4608bcab4..5ab88144c1 100644
--- a/dir.c
+++ b/dir.c
@@ -1940,7 +1940,7 @@ glob_helper(
pathtype = path_noent;
}
}
- if (match_dir && pathtype == path_unknown) {
+ if (match_dir && (pathtype == path_unknown || pathtype == path_symlink)) {
if (do_stat(fd, base, &st, flags, enc) == 0) {
pathtype = IFTODT(st.st_mode);
}
@@ -2042,14 +2042,12 @@ glob_helper(
break;
}
name = buf + pathlen + (dirsep != 0);
- if (recursive && dotfile < ((flags & FNM_DOTMATCH) ? 2 : 1)) {
+ if (dotfile < ((flags & FNM_DOTMATCH) ? 2 : 1) &&
#ifdef DT_UNKNOWN
- if ((new_pathtype = dp->d_type) != (rb_pathtype_t)DT_UNKNOWN)
- /* Got it. We need nothing more. */
- ;
- else
+ ((new_pathtype = dp->d_type) == (rb_pathtype_t)DT_UNKNOWN) &&
/* fall back to call lstat(2) */
#endif
+ recursive) {
/* RECURSIVE never match dot files unless FNM_DOTMATCH is set */
if (do_lstat(fd, buf, &st, flags, enc) == 0)
new_pathtype = IFTODT(st.st_mode);