aboutsummaryrefslogtreecommitdiffstats
path: root/dir.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-21 07:44:46 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-21 07:44:46 +0000
commitd0597cf86db4a5cb082d9c8c6d005a52b8e14ab7 (patch)
tree8b77794c595208096addc3b60351e2324f80cb82 /dir.c
parent78e5e7305bb712a1be1fe9a509d278945454ff2b (diff)
downloadruby-d0597cf86db4a5cb082d9c8c6d005a52b8e14ab7.tar.gz
dir.c: retry glob with GC
* dir.c (do_opendir): retry after GC when the limit for open file descriptors reached. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56467 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/dir.c b/dir.c
index cf4daeecf1..b2d88031e7 100644
--- a/dir.c
+++ b/dir.c
@@ -1286,8 +1286,19 @@ do_opendir(const char *path, int flags, rb_encoding *enc)
}
#endif
dirp = opendir(path);
- if (dirp == NULL && !to_be_ignored(errno))
- sys_warning(path, enc);
+ if (!dirp) {
+ int e = errno;
+ switch (rb_gc_for_fd(e)) {
+ default:
+ dirp = opendir(path);
+ if (dirp) break;
+ e = errno;
+ /* fallback */
+ case 0:
+ if (to_be_ignored(e)) break;
+ sys_warning(path, enc);
+ }
+ }
#ifdef _WIN32
if (tmp) rb_str_resize(tmp, 0); /* GC guard */
#endif