summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2010-11-02 00:36:07 +0000
committerSteve Huston <shuston@riverace.com>2010-11-02 00:36:07 +0000
commit82e4e23554996d2c6a9a65276f9c006086977f06 (patch)
treed3b346fb7af4b109b7f3342fec34670690b84b00
parente1daa38ab215448d1efca4e3000c1fc3f13e8cb1 (diff)
downloadATCD-82e4e23554996d2c6a9a65276f9c006086977f06.tar.gz
ChangeLogTag:Tue Nov 2 00:18:34 UTC 2010 Steve Huston <shuston@riverace.com>
-rw-r--r--ChangeLog8
-rw-r--r--ace/INET_Addr.cpp57
2 files changed, 41 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 0822a9c6f9b..f1ab07c8fcc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Nov 2 00:18:34 UTC 2010 Steve Huston <shuston@riverace.com>
+
+ * ace/INET_Addr.cpp (set): For platforms that have the GNU-extended
+ gethostbyname2_r() function, use it instead of getaddrinfo() for
+ a IPv6 hostname lookup. Customer reports that it getaddrinfo() is
+ hugely slower than gethostbyname2 on large vlans. The alternate
+ code is used if ACE_HAS_GETHOSTBYNAME2 is set in config.h.
+
Thu Oct 28 17:45:10 UTC 2010 Steve Huston <shuston@riverace.com>
* ace/INET_Addr.cpp (set): Corrected ACE_HAS_IPV6 checks made in
diff --git a/ace/INET_Addr.cpp b/ace/INET_Addr.cpp
index 5f7720eb897..54bc4f74dd9 100644
--- a/ace/INET_Addr.cpp
+++ b/ace/INET_Addr.cpp
@@ -348,37 +348,46 @@ ACE_INET_Addr::set (u_short port_number,
# endif /* ACE_USES_IPV4_IPV6_MIGRATION */
if (address_family != AF_INET)
{
+# if defined (ACE_HAS_GETHOSTBYNAME2)
+ hostent hentry;
+ ACE_HOSTENT_DATA buf;
+ int h_error = 0; // Not the same as errno!
+
+ hostent *hp = ::gethostbyname2_r (host_name, AF_INET6, &hentry,
+ buf, &h_error);
+ if (hp != 0)
+ {
+ this->set_type (hp->h_addrtype);
+ this->set_addr (hp->h_addr, hp->h_length);
+ this->set_port_number (port_number, encode);
+ return 0;
+ }
+ errno = h_error;
+ if (address_family == AF_INET6)
+ return -1;
+# else
struct addrinfo hints;
struct addrinfo *res = 0;
int error = 0;
ACE_OS::memset (&hints, 0, sizeof (hints));
hints.ai_family = AF_INET6;
- error = ::getaddrinfo (host_name, 0, &hints, &res);
- if (error)
+ if ((error = ::getaddrinfo (host_name, 0, &hints, &res)) == 0)
{
- if (address_family == AF_INET6)
- {
- if (res)
- ::freeaddrinfo(res);
- errno = error;
- return -1;
- }
- // Let AF_UNSPEC try again w/ IPv4.
- hints.ai_family = AF_INET;
- error = ::getaddrinfo (host_name, 0, &hints, &res);
- if (error)
- {
- if (res)
- ::freeaddrinfo(res);
- errno = error;
- return -1;
- }
+ this->set_type (res->ai_family);
+ this->set_addr (res->ai_addr, res->ai_addrlen);
+ this->set_port_number (port_number, encode);
+ ::freeaddrinfo (res);
+ return 0;
}
- this->set_type (res->ai_family);
- this->set_addr (res->ai_addr, res->ai_addrlen);
- this->set_port_number (port_number, encode);
- ::freeaddrinfo (res);
- return 0;
+ if (address_family == AF_INET6)
+ {
+ if (res)
+ ::freeaddrinfo(res);
+ errno = error;
+ return -1;
+ }
+# endif /* ACE_HAS_GETHOSTBYNAME2 */
+ // Let AF_UNSPEC try again w/ IPv4.
}
#endif /* ACE_HAS_IPV6 */