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

ruby-changes:10912

From: akr <ko1@a...>
Date: Sun, 22 Feb 2009 01:49:55 +0900 (JST)
Subject: [ruby-changes:10912] Ruby:r22487 (trunk): * ext/socket/ancdata.c (bsock_recvmsg_internal): gc when SCM_RIGHTS

akr	2009-02-22 01:49:44 +0900 (Sun, 22 Feb 2009)

  New Revision: 22487

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

  Log:
    * ext/socket/ancdata.c (bsock_recvmsg_internal): gc when SCM_RIGHTS
      hit the file descriptor limit.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/ancdata.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 22486)
+++ ChangeLog	(revision 22487)
@@ -1,3 +1,8 @@
+Sun Feb 22 01:48:51 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/ancdata.c (bsock_recvmsg_internal): gc when SCM_RIGHTS
+	  hit the file descriptor limit.
+
 Sun Feb 22 00:51:58 2009  Tanaka Akira  <akr@f...>
 
 	* io.c (io_getpartial): error message describes what should be
Index: ext/socket/ancdata.c
===================================================================
--- ext/socket/ancdata.c	(revision 22486)
+++ ext/socket/ancdata.c	(revision 22487)
@@ -1202,6 +1202,7 @@
     char *ctlbuf;
     VALUE ctl_str = Qnil;
     int family;
+    int gc_done = 0;
 #endif
 
     rb_secure(4);
@@ -1296,6 +1297,16 @@
     if (ss == -1) {
         if (nonblock && errno == EWOULDBLOCK)
             rb_sys_fail("recvmsg(2) WANT_READ");
+#if defined(HAVE_ST_MSG_CONTROL)
+        if (errno == EMFILE && !gc_done) {
+          /* SCM_RIGHTS hit the file descriptors limit, maybe. */
+          gc_and_retry:
+            discard_cmsg_resource(&mh);
+            rb_gc();
+            gc_done = 1;
+	    goto retry;
+        }
+#endif
 	rb_sys_fail("recvmsg(2)");
     }
 
@@ -1307,8 +1318,19 @@
 	    grown = 1;
 	}
         if (NIL_P(vmaxctllen) && (mh.msg_flags & MSG_CTRUNC)) {
-	    maxctllen *= 2;
-	    grown = 1;
+#define BIG_ENOUGH_SPACE 65536
+            if (BIG_ENOUGH_SPACE < maxctllen &&
+                mh.msg_controllen < maxctllen - BIG_ENOUGH_SPACE) {
+                /* there are big space bug truncated.
+                 * file descriptors limit? */
+                if (!gc_done)
+                    goto gc_and_retry;
+            }
+            else {
+                maxctllen *= 2;
+                grown = 1;
+            }
+#undef BIG_ENOUGH_SPACE
 	}
 #else
 	if (NIL_P(vmaxdatlen) && ss != -1 && ss == iov.iov_len) {

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

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