From 5d20d347c772a64a1dab362dbfae765a8d687f43 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 21 Oct 2016 07:44:46 +0000 Subject: 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 --- dir.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'dir.c') 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 -- cgit v1.2.3