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

ruby-changes:9778

From: akr <ko1@a...>
Date: Sun, 4 Jan 2009 22:39:22 +0900 (JST)
Subject: [ruby-changes:9778] Ruby:r21319 (trunk): * ext/socket/socket.c (rb_getaddrinfo): defined for address lookup without GVL.

akr	2009-01-04 22:38:58 +0900 (Sun, 04 Jan 2009)

  New Revision: 21319

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

  Log:
    * ext/socket/socket.c (rb_getaddrinfo): defined for address lookup without GVL.
      (struct getaddrinfo_arg): defined.
      (nogvl_getaddrinfo): defined.
      (rb_getnameinfo): defined for name lookup without GVL.
      (getnameinfo_arg): defined.
      (nogvl_getnameinfo): defined.

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21318)
+++ ChangeLog	(revision 21319)
@@ -1,3 +1,12 @@
+Sun Jan  4 22:37:19 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/socket.c (rb_getaddrinfo): defined for address lookup without GVL.
+	  (struct getaddrinfo_arg): defined.
+	  (nogvl_getaddrinfo): defined.
+	  (rb_getnameinfo): defined for name lookup without GVL.
+	  (getnameinfo_arg): defined.
+	  (nogvl_getnameinfo): defined.
+
 Sun Jan  4 18:10:10 2009  Martin Duerst  <duerst@i...>
 
 	* enc/trans/gbk.trans, gbk-tbl.rb:
Index: ext/socket/socket.c
===================================================================
--- ext/socket/socket.c	(revision 21318)
+++ ext/socket/socket.c	(revision 21319)
@@ -228,6 +228,7 @@
 #undef getnameinfo
 #define getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) \
             ruby_getnameinfo__aix((sa), (salen), (host), (hostlen), (serv), (servlen), (flags))
+
 #ifndef CMSG_SPACE
 # define CMSG_SPACE(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + _CMSG_ALIGN(len))
 #endif
@@ -241,7 +242,77 @@
 #define close closesocket
 #endif
 
+struct getaddrinfo_arg
+{
+    const char *node;
+    const char *service;
+    const struct addrinfo *hints;
+    struct addrinfo **res;
+};
+
+static VALUE
+nogvl_getaddrinfo(void *arg)
+{
+    struct getaddrinfo_arg *ptr = arg;
+    return getaddrinfo(ptr->node, ptr->service,
+                       ptr->hints, ptr->res);
+}
+
 static int
+rb_getaddrinfo(const char *node, const char *service,
+               const struct addrinfo *hints,
+               struct addrinfo **res)
+{
+    struct getaddrinfo_arg arg;
+    int ret;
+    arg.node = node;
+    arg.service = service;
+    arg.hints = hints;
+    arg.res = res;
+    ret = BLOCKING_REGION(nogvl_getaddrinfo, &arg);
+    return ret;
+}
+
+struct getnameinfo_arg
+{
+    const struct sockaddr *sa;
+    socklen_t salen;
+    char *host;
+    size_t hostlen;
+    char *serv;
+    size_t servlen;
+    int flags;
+};
+
+static VALUE
+nogvl_getnameinfo(void *arg)
+{
+    struct getnameinfo_arg *ptr = arg;
+    return getnameinfo(ptr->sa, ptr->salen,
+                       ptr->host, ptr->hostlen,
+                       ptr->serv, ptr->servlen,
+                       ptr->flags);
+}
+
+static int
+rb_getnameinfo(const struct sockaddr *sa, socklen_t salen,
+           char *host, size_t hostlen,
+           char *serv, size_t servlen, int flags)
+{
+    struct getnameinfo_arg arg;
+    int ret;
+    arg.sa = sa;
+    arg.salen = salen;
+    arg.host = host;
+    arg.hostlen = hostlen;
+    arg.serv = serv;
+    arg.servlen = servlen;
+    arg.flags = flags;
+    ret = BLOCKING_REGION(nogvl_getnameinfo, &arg);
+    return ret;
+}
+
+static int
 constant_arg(VALUE arg, int (*str_to_int)(char*, int, int*), const char *errmsg)
 {
     VALUE tmp;
@@ -893,7 +964,7 @@
 {
     int error;
 
-    error = getnameinfo(addr, SA_LEN(addr), buf, len, NULL, 0, NI_NUMERICHOST);
+    error = rb_getnameinfo(addr, SA_LEN(addr), buf, len, NULL, 0, NI_NUMERICHOST);
     if (error) {
 	raise_socket_error("getnameinfo", error);
     }
@@ -1015,7 +1086,7 @@
        hints->ai_socktype = SOCK_DGRAM;
     }
 
-    error = getaddrinfo(hostp, portp, hints, &res);
+    error = rb_getaddrinfo(hostp, portp, hints, &res);
     if (error) {
 	if (hostp && hostp[strlen(hostp)-1] == '\n') {
 	    rb_raise(rb_eSocket, "newline at the end of hostname");
@@ -1076,14 +1147,14 @@
 
     addr1 = Qnil;
     if (!norevlookup) {
-	error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
-			    NULL, 0, 0);
+	error = rb_getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
+			       NULL, 0, 0);
 	if (! error) {
 	    addr1 = rb_str_new2(hbuf);
 	}
     }
-    error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
-			pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV);
+    error = rb_getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
+			   pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV);
     if (error) {
 	raise_socket_error("getnameinfo", error);
     }
@@ -3393,7 +3464,7 @@
 	hints.ai_socktype = (fl & NI_DGRAM) ? SOCK_DGRAM : SOCK_STREAM;
 	/* af */
         hints.ai_family = NIL_P(af) ? PF_UNSPEC : family_arg(af);
-	error = getaddrinfo(hptr, pptr, &hints, &res);
+	error = rb_getaddrinfo(hptr, pptr, &hints, &res);
 	if (error) goto error_exit_addr;
 	sap = res->ai_addr;
     }
@@ -3402,16 +3473,16 @@
     }
 
   call_nameinfo:
-    error = getnameinfo(sap, SA_LEN(sap), hbuf, sizeof(hbuf),
-			pbuf, sizeof(pbuf), fl);
+    error = rb_getnameinfo(sap, SA_LEN(sap), hbuf, sizeof(hbuf),
+			   pbuf, sizeof(pbuf), fl);
     if (error) goto error_exit_name;
     if (res) {
 	for (r = res->ai_next; r; r = r->ai_next) {
 	    char hbuf2[1024], pbuf2[1024];
 
 	    sap = r->ai_addr;
-	    error = getnameinfo(sap, SA_LEN(sap), hbuf2, sizeof(hbuf2),
-				pbuf2, sizeof(pbuf2), fl);
+	    error = rb_getnameinfo(sap, SA_LEN(sap), hbuf2, sizeof(hbuf2),
+				   pbuf2, sizeof(pbuf2), fl);
 	    if (error) goto error_exit_name;
 	    if (strcmp(hbuf, hbuf2) != 0|| strcmp(pbuf, pbuf2) != 0) {
 		freeaddrinfo(res);

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

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