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/socket | |
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/socket')
-rw-r--r-- | ext/socket/socket.c | 77 |
1 files changed, 53 insertions, 24 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 9383580bdf..d4fd620a00 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -888,26 +888,25 @@ ruby_socket(domain, type, proto) } static int -wait_connectable(fd) +wait_connectable0(fd, fds_w, fds_e) int fd; + rb_fdset_t *fds_w, *fds_e; { int sockerr, sockerrlen; - fd_set fds_w; - fd_set fds_e; for (;;) { - FD_ZERO(&fds_w); - FD_ZERO(&fds_e); + rb_fd_zero(fds_w); + rb_fd_zero(fds_e); - FD_SET(fd, &fds_w); - FD_SET(fd, &fds_e); + rb_fd_set(fd, fds_w); + rb_fd_set(fd, fds_e); - rb_thread_select(fd+1, 0, &fds_w, &fds_e, 0); + rb_thread_select(fd+1, 0, rb_fd_ptr(fds_w), rb_fd_ptr(fds_e), 0); - if (FD_ISSET(fd, &fds_w)) { + if (rb_fd_isset(fd, fds_w)) { return 0; } - else if (FD_ISSET(fd, &fds_e)) { + else if (rb_fd_isset(fd, fds_e)) { sockerrlen = sizeof(sockerr); if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&sockerr, &sockerrlen) == 0) { @@ -922,6 +921,49 @@ wait_connectable(fd) return 0; } +struct wait_connectable_arg { + int fd; + rb_fdset_t fds_w; + rb_fdset_t fds_e; +}; + +#ifdef HAVE_RB_FD_INIT +static VALUE +try_wait_connectable(arg) + VALUE arg; +{ + struct wait_connectable_arg *p = (struct wait_connectable_arg *)arg; + return (VALUE)wait_connectable0(p->fd, &p->fds_w, &p->fds_e); +} + +static VALUE +wait_connectable_ensure(arg) + VALUE arg; +{ + struct wait_connectable_arg *p = (struct wait_connectable_arg *)arg; + rb_fd_term(&p->fds_w); + rb_fd_term(&p->fds_e); + return Qnil; +} +#endif + +static int +wait_connectable(fd) + int fd; +{ + struct wait_connectable_arg arg; + + rb_fd_init(&arg.fds_w); + rb_fd_init(&arg.fds_e); +#ifdef HAVE_RB_FD_INIT + arg.fd = fd; + return (int)rb_ensure(try_wait_connectable, (VALUE)&arg, + wait_connectable_ensure,(VALUE)&arg); +#else + return wait_connectable0(fd, &arg.fds_w, &arg.fds_e); +#endif +} + #ifdef __CYGWIN__ #define WAIT_IN_PROGRESS 10 #endif @@ -1734,19 +1776,6 @@ unix_send_io(sock, val) #endif } -#if defined(HAVE_RECVMSG) && (FD_PASSING_BY_MSG_CONTROL || FD_PASSING_BY_MSG_ACCRIGHTS) -static void -thread_read_select(fd) - int fd; -{ - fd_set fds; - - FD_ZERO(&fds); - FD_SET(fd, &fds); - rb_thread_select(fd+1, &fds, 0, 0, 0); -} -#endif - static VALUE unix_recv_io(argc, argv, sock) int argc; @@ -1776,7 +1805,7 @@ unix_recv_io(argc, argv, sock) GetOpenFile(sock, fptr); - thread_read_select(fptr->fd); + rb_io_wait_readable(fptr->fd); msg.msg_name = NULL; msg.msg_namelen = 0; |