aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-14 07:03:01 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-14 07:03:01 +0000
commita4e6f7d707293a71727ad18e75aae9639ba423f3 (patch)
tree490c0990e164882da43fdb2c52461723d7ca47c6
parentfcadcd3e68982ee727c0cc59bedadfc16b9ca214 (diff)
downloadruby-a4e6f7d707293a71727ad18e75aae9639ba423f3.tar.gz
ruby.c: reduce fstat
* file.c (ruby_is_fd_loadable): now return -1 if loadable but may block. * ruby.c (open_load_file): wait to read by the result of ruby_is_fd_loadable, without fstat. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--file.c3
-rw-r--r--ruby.c15
3 files changed, 14 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 5a70f8c493..11b2185e01 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Mar 14 16:02:59 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (ruby_is_fd_loadable): now return -1 if loadable but
+ may block.
+
+ * ruby.c (open_load_file): wait to read by the result of
+ ruby_is_fd_loadable, without fstat.
+
Mon Mar 14 13:38:38 2016 NARUSE, Yui <naruse@ruby-lang.org>
* numeric.c (fix2str): improve r54092 like rb_int2big().
diff --git a/file.c b/file.c
index 9f430a3382..96dd1b247e 100644
--- a/file.c
+++ b/file.c
@@ -5644,11 +5644,12 @@ ruby_is_fd_loadable(int fd)
if (fstat(fd, &st) < 0)
return 0;
+
if (S_ISREG(st.st_mode))
return 1;
if (S_ISFIFO(st.st_mode))
- return 1;
+ return -1;
if (S_ISDIR(st.st_mode))
errno = EISDIR;
diff --git a/ruby.c b/ruby.c
index e8633275dc..f96202e217 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1871,15 +1871,14 @@ open_load_file(VALUE fname_v, int *xflag)
}
#endif
-#ifdef S_ISFIFO
- {
- struct stat st;
- if (fstat(fd, &st) != 0) {
+ e = ruby_is_fd_loadable(fd);
+ if (e <= 0) {
+ if (!e) {
e = errno;
(void)close(fd);
rb_load_fail(fname_v, strerror(e));
}
- if (S_ISFIFO(st.st_mode)) {
+ else {
/*
We need to wait if FIFO is empty. It's FIFO's semantics.
rb_thread_wait_fd() release GVL. So, it's safe.
@@ -1887,12 +1886,6 @@ open_load_file(VALUE fname_v, int *xflag)
rb_thread_wait_fd(fd);
}
}
-#endif
- if (!ruby_is_fd_loadable(fd)) {
- e = errno;
- (void)close(fd);
- rb_load_fail(fname_v, strerror(e));
- }
f = rb_io_fdopen(fd, mode, fname);
}