summaryrefslogtreecommitdiff
path: root/ext/socket
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
commitc9d126aec990acb56dfa87b67e9fc312f82da91d (patch)
tree23d741448c4f9a2b75c2cd876423ed27db4edd8e /ext/socket
parentf0ede6b31cc81671d231a92db8b3e87127f4eb24 (diff)
* 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.c77
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;