summaryrefslogtreecommitdiffstats
path: root/ext/io
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-03 14:23:17 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-03 14:23:17 +0000
commit9579d87a23a6e774d7721fb1a06b9ee79bb71577 (patch)
tree23d741448c4f9a2b75c2cd876423ed27db4edd8e /ext/io
parent3e378f6cb944283a5ac4941897cfd9a0ae8f0de7 (diff)
downloadruby-9579d87a23a6e774d7721fb1a06b9ee79bb71577.tar.gz
ruby-9579d87a23a6e774d7721fb1a06b9ee79bb71577.tar.xz
ruby-9579d87a23a6e774d7721fb1a06b9ee79bb71577.zip
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@8552 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/io')
-rw-r--r--ext/io/wait/wait.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/ext/io/wait/wait.c b/ext/io/wait/wait.c
index df8d24c29..fcb3bcfe4 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);