summaryrefslogtreecommitdiff
path: root/ext/socket
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-13 12:41:12 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-13 12:41:12 +0000
commit84775721bcd0b4b7330e0743fe3d53d9522ae858 (patch)
tree309b499c8376b0cc9f0dcb9a020a4efb4e034dd9 /ext/socket
parente1809a0cedfd948bdc229653b5e8b0d5972d114e (diff)
* 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.rb1
-rw-r--r--ext/socket/socket.c12
2 files changed, 13 insertions, 0 deletions
diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb
index 06011d61a84..443dd7d21e5 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 f608e6e434d..cd6acd46471 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