diff options
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 30 |
1 files changed, 19 insertions, 11 deletions
@@ -151,10 +151,11 @@ struct argf { }; static int max_file_descriptor = NOFILE; -#define UPDATE_MAXFD(fd) \ - do { \ - if (max_file_descriptor < (fd)) max_file_descriptor = (fd); \ - } while (0) +void +rb_update_max_fd(int fd) +{ + if (max_file_descriptor < fd) max_file_descriptor = fd; +} #define argf_of(obj) (*(struct argf *)DATA_PTR(obj)) #define ARGF argf_of(argf) @@ -526,7 +527,7 @@ ruby_dup(int orig) rb_sys_fail(0); } } - UPDATE_MAXFD(fd); + rb_update_max_fd(fd); return fd; } @@ -4591,7 +4592,11 @@ sysopen_func(void *ptr) static inline int rb_sysopen_internal(struct sysopen_struct *data) { - return (int)rb_thread_blocking_region(sysopen_func, data, RUBY_UBF_IO, 0); + int fd; + fd = (int)rb_thread_blocking_region(sysopen_func, data, RUBY_UBF_IO, 0); + if (0 <= fd) + rb_update_max_fd(fd); + return fd; } static int @@ -4617,7 +4622,7 @@ rb_sysopen(VALUE fname, int oflags, mode_t perm) rb_sys_fail(RSTRING_PTR(fname)); } } - UPDATE_MAXFD(fd); + rb_update_max_fd(fd); return fd; } @@ -4910,8 +4915,8 @@ rb_pipe(int *pipes) } } if (ret == 0) { - UPDATE_MAXFD(pipes[0]); - UPDATE_MAXFD(pipes[1]); + rb_update_max_fd(pipes[0]); + rb_update_max_fd(pipes[1]); } return ret; } @@ -5793,6 +5798,7 @@ io_reopen(VALUE io, VALUE nfile) /* need to keep FILE objects of stdin, stdout and stderr */ if (dup2(fd2, fd) < 0) rb_sys_fail_path(orig->pathv); + rb_update_max_fd(fd); } else { fclose(fptr->stdio_file); @@ -5800,6 +5806,7 @@ io_reopen(VALUE io, VALUE nfile) fptr->fd = -1; if (dup2(fd2, fd) < 0) rb_sys_fail_path(orig->pathv); + rb_update_max_fd(fd); fptr->fd = fd; } rb_thread_fd_close(fd); @@ -6383,6 +6390,7 @@ prep_io(int fd, int fmode, VALUE klass, const char *path) fp->mode = fmode; io_check_tty(fp); if (path) fp->pathv = rb_obj_freeze(rb_str_new_cstr(path)); + rb_update_max_fd(fd); return io; } @@ -6535,7 +6543,7 @@ rb_io_initialize(int argc, VALUE *argv, VALUE io) #else if (fstat(fd, &st) == -1) rb_sys_fail(0); #endif - UPDATE_MAXFD(fd); + rb_update_max_fd(fd); #if defined(HAVE_FCNTL) && defined(F_GETFL) ofmode = rb_io_oflags_fmode(oflags); if (NIL_P(vmode)) { @@ -7690,7 +7698,7 @@ io_cntl(int fd, int cmd, long narg, int io_p) retval = (int)rb_thread_io_blocking_region(nogvl_io_cntl, &arg, fd); #if defined(F_DUPFD) if (!io_p && retval != -1 && cmd == F_DUPFD) { - UPDATE_MAXFD(retval); + rb_update_max_fd(retval); } #endif |