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/