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

ruby-changes:21547

From: akr <ko1@a...>
Date: Tue, 1 Nov 2011 08:26:28 +0900 (JST)
Subject: [ruby-changes:21547] akr:r33596 (trunk): * ext/socket/init.c (cloexec_accept): new function to use accept4 if

akr	2011-11-01 08:26:19 +0900 (Tue, 01 Nov 2011)

  New Revision: 33596

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33596

  Log:
    * ext/socket/init.c (cloexec_accept): new function to use accept4 if
      available.
      (rsock_s_accept_nonblock): use cloexec_accept.
      (accept_blocking): ditto.
    
    * ext/socket/extconf.rb: check accept4.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/extconf.rb
    trunk/ext/socket/init.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33595)
+++ ChangeLog	(revision 33596)
@@ -1,3 +1,12 @@
+Tue Nov  1 08:24:40 2011  Tanaka Akira  <akr@f...>
+
+	* ext/socket/init.c (cloexec_accept): new function to use accept4 if
+	  available.
+	  (rsock_s_accept_nonblock): use cloexec_accept.
+	  (accept_blocking): ditto.
+
+	* ext/socket/extconf.rb: check accept4.
+
 Tue Nov  1 07:31:55 2011  Tanaka Akira  <akr@f...>
 
 	* ext/socket/ancdata.c (nogvl_recvmsg_func): use MSG_CMSG_CLOEXEC if
Index: ext/socket/init.c
===================================================================
--- ext/socket/init.c	(revision 33595)
+++ ext/socket/init.c	(revision 33596)
@@ -463,6 +463,30 @@
     }
 }
 
+static int
+cloexec_accept(int socket, struct sockaddr *address, socklen_t *address_len)
+{
+    int ret;
+#ifdef HAVE_ACCEPT4
+    static int try_accept4 = 1;
+    if (try_accept4) {
+        ret = accept4(socket, address, address_len, SOCK_CLOEXEC);
+        /* accept4 is available since Linux 2.6.28, glibc 2.10. */
+        if (ret == -1 && errno == ENOSYS) {
+            try_accept4 = 0;
+            ret = accept(socket, address, address_len);
+        }
+    }
+    else {
+        ret = accept(socket, address, address_len);
+    }
+#else
+    ret = accept(socket, address, address_len);
+#endif
+    return ret;
+}
+
+
 VALUE
 rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len)
 {
@@ -470,7 +494,7 @@
 
     rb_secure(3);
     rb_io_set_nonblock(fptr);
-    fd2 = accept(fptr->fd, (struct sockaddr*)sockaddr, len);
+    fd2 = cloexec_accept(fptr->fd, (struct sockaddr*)sockaddr, len);
     if (fd2 < 0) {
 	switch (errno) {
 	  case EAGAIN:
@@ -500,7 +524,7 @@
 accept_blocking(void *data)
 {
     struct accept_arg *arg = data;
-    return (VALUE)accept(arg->fd, arg->sockaddr, arg->len);
+    return (VALUE)cloexec_accept(arg->fd, arg->sockaddr, arg->len);
 }
 
 VALUE
Index: ext/socket/extconf.rb
===================================================================
--- ext/socket/extconf.rb	(revision 33595)
+++ ext/socket/extconf.rb	(revision 33596)
@@ -397,6 +397,8 @@
   end
 end
 
+have_func("accept4")
+
 $objs = [
   "init.#{$OBJEXT}",
   "constants.#{$OBJEXT}",

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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