diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-03 14:23:17 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-03 14:23:17 +0000 |
commit | c9d126aec990acb56dfa87b67e9fc312f82da91d (patch) | |
tree | 23d741448c4f9a2b75c2cd876423ed27db4edd8e /ext/io/wait/wait.c | |
parent | f0ede6b31cc81671d231a92db8b3e87127f4eb24 (diff) | |
download | ruby-c9d126aec990acb56dfa87b67e9fc312f82da91d.tar.gz |
* intern.h (rb_fdset_t): deal with fd bit sets over FD_SETSIZE.
fixed: [ruby-dev:26187]
* eval.c (rb_fd_init, rb_fd_term, rb_fd_zero, rb_fd_set, rb_fd_clr,
rb_fd_isset, rb_fd_copy): ditto.
* io.c (rb_io_wait_readable, rb_io_wait_writable, rb_f_select): ditto.
* ext/io/wait/wait.c (io_wait): ditto.
* ext/socket/socket.c (wait_connectable, unix_recv_io): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/io/wait/wait.c')
-rw-r--r-- | ext/io/wait/wait.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/ext/io/wait/wait.c b/ext/io/wait/wait.c index df8d24c29b..fcb3bcfe42 100644 --- a/ext/io/wait/wait.c +++ b/ext/io/wait/wait.c @@ -50,6 +50,23 @@ io_ready_p(io) return Qnil; } +struct wait_readable_arg { + rb_fdset_t fds; + struct timeval *timeout; +}; + +#ifdef HAVE_RB_FD_INIT +static VALUE +wait_readable(p) + VALUE p; +{ + struct wait_readable_arg *arg = (struct wait_readable_arg *)p; + rb_fdset_t *fds = &arg->fds; + + return (VALUE)rb_thread_select(rb_fd_max(fds), rb_fd_ptr(fds), NULL, NULL, arg->timeout); +} +#endif + /* =begin --- IO#wait([timeout]) @@ -64,27 +81,33 @@ io_wait(argc, argv, io) VALUE io; { OpenFile *fptr; - fd_set rd; + struct wait_readable_arg arg; int fd, n; VALUE timeout; - struct timeval *tp, timerec; + struct timeval timerec; GetOpenFile(io, fptr); rb_io_check_readable(fptr); rb_scan_args(argc, argv, "01", &timeout); if (NIL_P(timeout)) { - tp = 0; + arg.timeout = 0; } else { timerec = rb_time_interval(timeout); - tp = &timerec; + arg.timeout = &timerec; } if (rb_io_read_pending(fptr)) return Qtrue; fd = fptr->fd; - FD_ZERO(&rd); - FD_SET(fd, &rd); - if (rb_thread_select(fd + 1, &rd, NULL, NULL, tp) < 0) + rb_fd_init(&arg.fds); + rb_fd_set(fd, &arg.fds); +#ifdef HAVE_RB_FD_INIT + n = (int)rb_ensure(wait_readable, (VALUE)&arg, + (VALUE (*)_((VALUE)))rb_fd_term, (VALUE)&arg.fds); +#else + n = rb_thread_select(fd + 1, rb_fd_ptr(&rd), NULL, NULL, tp) +#endif + if (n < 0) rb_sys_fail(0); rb_io_check_closed(fptr); if (ioctl(fptr->fd, FIONREAD, &n)) rb_sys_fail(0); |