diff options
-rw-r--r-- | ACE/ace/OS_NS_Thread.cpp | 10 | ||||
-rw-r--r-- | ACE/ace/OS_NS_Thread.h | 1 | ||||
-rw-r--r-- | ACE/ace/OS_NS_Thread.inl | 10 | ||||
-rw-r--r-- | ACE/ace/SOCK_Dgram.cpp | 44 | ||||
-rw-r--r-- | ACE/ace/config-win32-common.h | 6 |
5 files changed, 40 insertions, 31 deletions
diff --git a/ACE/ace/OS_NS_Thread.cpp b/ACE/ace/OS_NS_Thread.cpp index ef2f13ac2a0..2cd16d29e7a 100644 --- a/ACE/ace/OS_NS_Thread.cpp +++ b/ACE/ace/OS_NS_Thread.cpp @@ -4839,16 +4839,6 @@ ACE_OS::unique_name (const void *object, } #endif -pid_t -ACE_OS::thr_gettid () -{ -#ifdef ACE_HAS_GETTID - return syscall (SYS_gettid); -#else - ACE_NOTSUP_RETURN (-1); -#endif -} - ACE_END_VERSIONED_NAMESPACE_DECL #if defined (ACE_VXWORKS) && !defined (__RTP__) diff --git a/ACE/ace/OS_NS_Thread.h b/ACE/ace/OS_NS_Thread.h index e01e8a2b4f7..9419f1d0812 100644 --- a/ACE/ace/OS_NS_Thread.h +++ b/ACE/ace/OS_NS_Thread.h @@ -1767,6 +1767,7 @@ namespace ACE_OS { * For older Linux (pre 2.4.11) and other systems that don't have gettid(), * this uses ACE_NOTSUP_RETURN (-1). */ + ACE_NAMESPACE_INLINE_FUNCTION pid_t thr_gettid (); /** diff --git a/ACE/ace/OS_NS_Thread.inl b/ACE/ace/OS_NS_Thread.inl index 4b34fdeea11..7ab6d5894f1 100644 --- a/ACE/ace/OS_NS_Thread.inl +++ b/ACE/ace/OS_NS_Thread.inl @@ -3179,6 +3179,16 @@ ACE_OS::thr_gettid (char buffer[], size_t buffer_length) static_cast<int> (ACE_OS::thr_gettid ())); } +ACE_INLINE pid_t +ACE_OS::thr_gettid () +{ +#ifdef ACE_HAS_GETTID + return syscall (SYS_gettid); +#else + ACE_NOTSUP_RETURN (-1); +#endif +} + ACE_INLINE ACE_thread_t ACE_OS::thr_self () { diff --git a/ACE/ace/SOCK_Dgram.cpp b/ACE/ace/SOCK_Dgram.cpp index f0688344f2f..eb01d7c0cf7 100644 --- a/ACE/ace/SOCK_Dgram.cpp +++ b/ACE/ace/SOCK_Dgram.cpp @@ -786,21 +786,34 @@ ACE_SOCK_Dgram::make_multicast_ifaddr6 (ipv6_mreq *ret_mreq, ACE_OS::ace_isdigit (net_if[0]) && (if_ix = ACE_OS::atoi (net_if)) > 0; - IP_ADAPTER_ADDRESSES tmp_addrs; - // Initial call to determine actual memory size needed - ULONG bufLen = 0; + ULONG bufLen = 15000; // Initial size as per Microsoft char *buf = 0; - if (::GetAdaptersAddresses (AF_INET6, 0, 0, &tmp_addrs, &bufLen) - == ERROR_BUFFER_OVERFLOW) + ACE_NEW_RETURN (buf, char[bufLen], -1); + DWORD dwRetVal = 0; + ULONG iterations = 0; + ULONG const maxTries = 3; + PIP_ADAPTER_ADDRESSES pAddrs; + do { - ACE_NEW_RETURN (buf, char[bufLen], -1); - } + pAddrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES> (buf); + dwRetVal = ::GetAdaptersAddresses (AF_INET6, 0, 0, pAddrs, &bufLen); + if (dwRetVal == ERROR_BUFFER_OVERFLOW) + { + delete[] buf; + ACE_NEW_RETURN (buf, char[bufLen], -1); + ++iterations; + } + else + { + break; + } + } while (dwRetVal == ERROR_BUFFER_OVERFLOW && iterations < maxTries); - // Get required output buffer and retrieve info for real. - PIP_ADAPTER_ADDRESSES pAddrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES> (buf); - if (::GetAdaptersAddresses (AF_INET6, 0, 0, pAddrs, &bufLen) != NO_ERROR) + if (dwRetVal != NO_ERROR) { - pAddrs = 0; + delete[] buf; + errno = EINVAL; + return -1; } while (pAddrs) @@ -819,14 +832,11 @@ ACE_SOCK_Dgram::make_multicast_ifaddr6 (ipv6_mreq *ret_mreq, delete[] buf; // clean up -#endif /* ACE_WIN32 */ +#else /* ACE_WIN32 */ #ifndef ACE_LACKS_IF_NAMETOINDEX - if (lmreq.ipv6mr_interface == 0) - { - lmreq.ipv6mr_interface = ACE_OS::if_nametoindex (ACE_TEXT_ALWAYS_CHAR (net_if)); - } - + lmreq.ipv6mr_interface = ACE_OS::if_nametoindex (ACE_TEXT_ALWAYS_CHAR (net_if)); #endif /* ACE_LACKS_IF_NAMETOINDEX */ +#endif /* ACE_WIN32 */ if (lmreq.ipv6mr_interface == 0) { errno = EINVAL; diff --git a/ACE/ace/config-win32-common.h b/ACE/ace/config-win32-common.h index b771a6418dc..4664b7016d0 100644 --- a/ACE/ace/config-win32-common.h +++ b/ACE/ace/config-win32-common.h @@ -277,10 +277,6 @@ #define ACE_LACKS_GETIPNODEBYNAME_IPV6 #define ACE_LACKS_KILL #define ACE_LACKS_INET_ATON -#if _WIN32_WINNT < 0x0600 -# define ACE_LACKS_INET_NTOP -# define ACE_LACKS_INET_PTON -#endif #define ACE_LACKS_MADVISE #define ACE_LACKS_MKFIFO #define ACE_LACKS_MODE_MASKS @@ -555,6 +551,8 @@ # define ACE_HAS_WIN32_TRYLOCK #endif #if _WIN32_WINNT < 0x600 +# define ACE_LACKS_INET_NTOP +# define ACE_LACKS_INET_PTON # define ACE_LACKS_IF_NAMETOINDEX #endif #define ACE_LACKS_IF_NAMEINDEX |