1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33572 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2011-10-30 12:13:05 +00:00
parent 6e0ed044b6
commit 0d2a92e0b3
4 changed files with 37 additions and 21 deletions

View file

@ -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.

View file

@ -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);

35
io.c
View file

@ -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;
}

View file

@ -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) */