summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ACE/ace/OS_NS_Thread.cpp10
-rw-r--r--ACE/ace/OS_NS_Thread.h1
-rw-r--r--ACE/ace/OS_NS_Thread.inl10
-rw-r--r--ACE/ace/SOCK_Dgram.cpp44
-rw-r--r--ACE/ace/config-win32-common.h6
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