diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-13 12:41:12 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-13 12:41:12 +0000 |
commit | 84775721bcd0b4b7330e0743fe3d53d9522ae858 (patch) | |
tree | 309b499c8376b0cc9f0dcb9a020a4efb4e034dd9 /ext/socket | |
parent | e1809a0cedfd948bdc229653b5e8b0d5972d114e (diff) | |
download | ruby-84775721bcd0b4b7330e0743fe3d53d9522ae858.tar.gz |
* ext/socket/socket.c (rb_getaddrinfo): use getaddrinfo with GVL if
getaddrinfo.c/getnameinfo.c is used. They are not thread safe
because gethostbyname/gethostbyaddr is used.
(rb_getnameinfo): ditto.
* extconf.rb: define GETADDRINFO_EMU if getaddrinfo.c/getnameinfo.c is
used.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21494 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket')
-rw-r--r-- | ext/socket/extconf.rb | 1 | ||||
-rw-r--r-- | ext/socket/socket.c | 12 |
2 files changed, 13 insertions, 0 deletions
diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb index 06011d61a8..443dd7d21e 100644 --- a/ext/socket/extconf.rb +++ b/ext/socket/extconf.rb @@ -251,6 +251,7 @@ unless getaddr_info_ok and have_func("getnameinfo", headers) and have_func("geta $CPPFLAGS="-I. "+$CPPFLAGS $objs += ["getaddrinfo.#{$OBJEXT}"] $objs += ["getnameinfo.#{$OBJEXT}"] + $defs << "-DGETADDRINFO_EMU" have_func("inet_ntop") or have_func("inet_ntoa") have_func("inet_pton") or have_func("inet_aton") have_func("getservbyport") diff --git a/ext/socket/socket.c b/ext/socket/socket.c index f608e6e434..cd6acd4647 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -238,6 +238,7 @@ ruby_getnameinfo__aix(const struct sockaddr *sa, size_t salen, #define close closesocket #endif +#ifndef GETADDRINFO_EMU struct getaddrinfo_arg { const char *node; @@ -253,12 +254,16 @@ nogvl_getaddrinfo(void *arg) return getaddrinfo(ptr->node, ptr->service, ptr->hints, ptr->res); } +#endif static int rb_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { +#ifdef GETADDRINFO_EMU + return getaddrinfo(node, service, hints, res); +#else struct getaddrinfo_arg arg; int ret; arg.node = node; @@ -267,8 +272,10 @@ rb_getaddrinfo(const char *node, const char *service, arg.res = res; ret = BLOCKING_REGION(nogvl_getaddrinfo, &arg); return ret; +#endif } +#ifndef GETADDRINFO_EMU struct getnameinfo_arg { const struct sockaddr *sa; @@ -289,12 +296,16 @@ nogvl_getnameinfo(void *arg) ptr->serv, ptr->servlen, ptr->flags); } +#endif static int rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags) { +#ifdef GETADDRINFO_EMU + return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags); +#else struct getnameinfo_arg arg; int ret; arg.sa = sa; @@ -306,6 +317,7 @@ rb_getnameinfo(const struct sockaddr *sa, socklen_t salen, arg.flags = flags; ret = BLOCKING_REGION(nogvl_getnameinfo, &arg); return ret; +#endif } static int |