diff options
author | Steve Huston <shuston@riverace.com> | 2010-11-02 00:36:07 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 2010-11-02 00:36:07 +0000 |
commit | 82e4e23554996d2c6a9a65276f9c006086977f06 (patch) | |
tree | d3b346fb7af4b109b7f3342fec34670690b84b00 | |
parent | e1daa38ab215448d1efca4e3000c1fc3f13e8cb1 (diff) | |
download | ATCD-82e4e23554996d2c6a9a65276f9c006086977f06.tar.gz |
ChangeLogTag:Tue Nov 2 00:18:34 UTC 2010 Steve Huston <shuston@riverace.com>
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ace/INET_Addr.cpp | 57 |
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 */ |