[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]