ruby-changes:19383
From: kosaki <ko1@a...>
Date: Wed, 4 May 2011 10:16:50 +0900 (JST)
Subject: [ruby-changes:19383] Ruby:r31422 (trunk): * ext/socket/init.c (wait_connectable): use rb_wait_for_single_fd().
kosaki 2011-05-04 10:12:04 +0900 (Wed, 04 May 2011) New Revision: 31422 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31422 Log: * ext/socket/init.c (wait_connectable): use rb_wait_for_single_fd(). The patch was written by Eric Wong. [Ruby 1.9 - Feature #4531] * ext/socket/init.c (try_wait_connectable, wait_connectable_ensure): removed. Modified files: trunk/ChangeLog trunk/ext/socket/init.c Index: ChangeLog =================================================================== --- ChangeLog (revision 31421) +++ ChangeLog (revision 31422) @@ -1,3 +1,11 @@ +Wed May 4 10:10:28 2011 KOSAKI Motohiro <kosaki.motohiro@g...> + + * ext/socket/init.c (wait_connectable): use rb_wait_for_single_fd(). + The patch was written by Eric Wong. [Ruby 1.9 - Feature #4531] + + * ext/socket/init.c (try_wait_connectable, wait_connectable_ensure): + removed. + Wed May 4 10:07:48 2011 KOSAKI Motohiro <kosaki.motohiro@g...> * ext/io/wait/wait.c (io_wait): use rb_wait_for_single_fd(). Index: ext/socket/init.c =================================================================== --- ext/socket/init.c (revision 31421) +++ ext/socket/init.c (revision 31422) @@ -254,76 +254,28 @@ } static int -wait_connectable0(int fd, rb_fdset_t *fds_w, rb_fdset_t *fds_e) +wait_connectable(int fd) { int sockerr; socklen_t sockerrlen; + int r; for (;;) { - rb_fd_zero(fds_w); - rb_fd_zero(fds_e); - - rb_fd_set(fd, fds_w); - rb_fd_set(fd, fds_e); - - rb_thread_fd_select(fd+1, 0, fds_w, fds_e, 0); - - if (rb_fd_isset(fd, fds_w)) { + r = rb_wait_for_single_fd(fd, RB_WAITFD_OUT|RB_WAITFD_PRI, NULL); + if ((r > 0) && (r & RB_WAITFD_OUT)) return 0; + + sockerrlen = (socklen_t)sizeof(sockerr); + if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&sockerr, + &sockerrlen) == 0) { + if (sockerr == 0) + continue; /* workaround for winsock */ + errno = sockerr; } - else if (rb_fd_isset(fd, fds_e)) { - sockerrlen = (socklen_t)sizeof(sockerr); - if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&sockerr, - &sockerrlen) == 0) { - if (sockerr == 0) - continue; /* workaround for winsock */ - errno = sockerr; - } - return -1; - } + return -1; } } -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(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(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(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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/