summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--include/ruby/intern.h1
-rw-r--r--io.c35
-rw-r--r--thread_pthread.c12
4 files changed, 37 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 9cc28e4d0c..57182b8e50 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Sun Oct 30 21:12:47 2011 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/intern.h (rb_cloexec_pipe): declared.
+
+ * io.c (rb_cloexec_pipe): new function.
+ (rb_pipe): use rb_cloexec_pipe.
+
+ * thread_pthread.c (rb_thread_create_timer_thread): use
+ rb_cloexec_pipe.
+
Sun Oct 30 20:06:07 2011 Tanaka Akira <akr@fsij.org>
* io.c (rb_cloexec_dup): refine control flow.
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 626bcf193f..de2fdbd57b 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -505,6 +505,7 @@ int rb_reserved_fd_p(int fd);
int rb_cloexec_open(const char *pathname, int flags, mode_t mode);
int rb_cloexec_dup(int oldfd);
int rb_cloexec_dup2(int oldfd, int newfd);
+int rb_cloexec_pipe(int fildes[2]);
#define RB_RESERVED_FD_P(fd) rb_reserved_fd_p(fd)
void rb_update_max_fd(int fd);
void rb_fd_set_cloexec(int fd);
diff --git a/io.c b/io.c
index 4dbf337e8c..33b7382ab4 100644
--- a/io.c
+++ b/io.c
@@ -262,6 +262,25 @@ rb_cloexec_dup2(int oldfd, int newfd)
return ret;
}
+int
+rb_cloexec_pipe(int fildes[2])
+{
+ int ret;
+ ret = pipe(fildes);
+ if (ret == -1) return -1;
+#ifdef __CYGWIN__
+ if (ret == 0 && fildes[1] == -1) {
+ close(fildes[0]);
+ fildes[0] = -1;
+ errno = ENFILE;
+ return -1;
+ }
+#endif
+ fd_set_cloexec(fildes[0]);
+ fd_set_cloexec(fildes[1]);
+ return ret;
+}
+
#define argf_of(obj) (*(struct argf *)DATA_PTR(obj))
#define ARGF argf_of(argf)
@@ -5008,24 +5027,16 @@ int
rb_pipe(int *pipes)
{
int ret;
- ret = pipe(pipes);
+ ret = rb_cloexec_pipe(pipes);
if (ret == -1) {
if (errno == EMFILE || errno == ENFILE) {
rb_gc();
- ret = pipe(pipes);
+ ret = rb_cloexec_pipe(pipes);
}
}
-#ifdef __CYGWIN__
- if (ret == 0 && pipes[1] == -1) {
- close(pipes[0]);
- pipes[0] = -1;
- errno = ENFILE;
- return -1;
- }
-#endif
if (ret == 0) {
- rb_fd_set_cloexec(pipes[0]);
- rb_fd_set_cloexec(pipes[1]);
+ rb_update_max_fd(pipes[0]);
+ rb_update_max_fd(pipes[1]);
}
return ret;
}
diff --git a/thread_pthread.c b/thread_pthread.c
index be3148dc30..3e4231fd27 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -1210,12 +1210,12 @@ rb_thread_create_timer_thread(void)
close_communication_pipe();
}
- err = pipe(timer_thread_pipe);
+ err = rb_cloexec_pipe(timer_thread_pipe);
if (err != 0) {
rb_bug_errno("thread_timer: Failed to create communication pipe for timer thread", errno);
}
- rb_fd_set_cloexec(timer_thread_pipe[0]);
- rb_fd_set_cloexec(timer_thread_pipe[1]);
+ rb_update_max_fd(timer_thread_pipe[0]);
+ rb_update_max_fd(timer_thread_pipe[1]);
#if defined(HAVE_FCNTL) && defined(F_GETFL) && defined(F_SETFL)
{
int oflags;
@@ -1224,12 +1224,6 @@ rb_thread_create_timer_thread(void)
oflags |= O_NONBLOCK;
fcntl(timer_thread_pipe[1], F_SETFL, oflags);
#endif /* defined(O_NONBLOCK) */
-#if defined(FD_CLOEXEC)
- oflags = fcntl(timer_thread_pipe[0], F_GETFD);
- fcntl(timer_thread_pipe[0], F_SETFD, oflags | FD_CLOEXEC);
- oflags = fcntl(timer_thread_pipe[1], F_GETFD);
- fcntl(timer_thread_pipe[1], F_SETFD, oflags | FD_CLOEXEC);
-#endif /* defined(FD_CLOEXEC) */
}
#endif /* defined(HAVE_FCNTL) && defined(F_GETFL) && defined(F_SETFL) */