mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Revert "Use async name resolving to improve net thread responsiveness"
This reverts commit caf6150e97
.
getaddrinfo_a has a nasty tendency to segfault internally in its
background thread, on every version of glibc I tested, especially
under helgrind.
See https://sourceware.org/bugzilla/show_bug.cgi?id=20874
This commit is contained in:
parent
ad826b3df9
commit
10ae7a7b23
@ -512,8 +512,6 @@ if test x$TARGET_OS = xdarwin; then
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h])
|
||||
AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])])
|
||||
AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])])
|
||||
|
||||
AC_CHECK_DECLS([strnlen])
|
||||
|
||||
|
@ -94,30 +94,9 @@ bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsign
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_GETADDRINFO_A
|
||||
struct in_addr ipv4_addr;
|
||||
#ifdef HAVE_INET_PTON
|
||||
if (inet_pton(AF_INET, pszName, &ipv4_addr) > 0) {
|
||||
vIP.push_back(CNetAddr(ipv4_addr));
|
||||
return true;
|
||||
}
|
||||
|
||||
struct in6_addr ipv6_addr;
|
||||
if (inet_pton(AF_INET6, pszName, &ipv6_addr) > 0) {
|
||||
vIP.push_back(CNetAddr(ipv6_addr));
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
ipv4_addr.s_addr = inet_addr(pszName);
|
||||
if (ipv4_addr.s_addr != INADDR_NONE) {
|
||||
vIP.push_back(CNetAddr(ipv4_addr));
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct addrinfo aiHint;
|
||||
memset(&aiHint, 0, sizeof(struct addrinfo));
|
||||
|
||||
aiHint.ai_socktype = SOCK_STREAM;
|
||||
aiHint.ai_protocol = IPPROTO_TCP;
|
||||
aiHint.ai_family = AF_UNSPEC;
|
||||
@ -126,33 +105,8 @@ bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsign
|
||||
#else
|
||||
aiHint.ai_flags = fAllowLookup ? AI_ADDRCONFIG : AI_NUMERICHOST;
|
||||
#endif
|
||||
|
||||
struct addrinfo *aiRes = NULL;
|
||||
#ifdef HAVE_GETADDRINFO_A
|
||||
struct gaicb gcb, *query = &gcb;
|
||||
memset(query, 0, sizeof(struct gaicb));
|
||||
gcb.ar_name = pszName;
|
||||
gcb.ar_request = &aiHint;
|
||||
int nErr = getaddrinfo_a(GAI_NOWAIT, &query, 1, NULL);
|
||||
if (nErr)
|
||||
return false;
|
||||
|
||||
do {
|
||||
// Should set the timeout limit to a reasonable value to avoid
|
||||
// generating unnecessary checking call during the polling loop,
|
||||
// while it can still response to stop request quick enough.
|
||||
// 2 seconds looks fine in our situation.
|
||||
struct timespec ts = { 2, 0 };
|
||||
gai_suspend(&query, 1, &ts);
|
||||
boost::this_thread::interruption_point();
|
||||
|
||||
nErr = gai_error(query);
|
||||
if (0 == nErr)
|
||||
aiRes = query->ar_result;
|
||||
} while (nErr == EAI_INPROGRESS);
|
||||
#else
|
||||
int nErr = getaddrinfo(pszName, NULL, &aiHint, &aiRes);
|
||||
#endif
|
||||
if (nErr)
|
||||
return false;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user