From 8b3159ef0a912da67c545a3d24f4558f8df866e4 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Tue, 27 Dec 2016 17:13:31 -0500 Subject: [PATCH] net: make proxy receives interruptible --- src/net.cpp | 2 ++ src/netbase.cpp | 12 ++++++++++-- src/netbase.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index bbfada430..7e16e2382 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2157,6 +2157,7 @@ bool CConnman::Start(CScheduler& scheduler, std::string& strNodeError, Options c // // Start threads // + InterruptSocks5(false); interruptNet.reset(); flagInterruptMsgProc = false; @@ -2208,6 +2209,7 @@ void CConnman::Interrupt() condMsgProc.notify_all(); interruptNet(); + InterruptSocks5(true); if (semOutbound) for (int i=0; i<(nMaxOutbound + nMaxFeeler); i++) diff --git a/src/netbase.cpp b/src/netbase.cpp index da94fd4d1..87c7abd7c 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -19,6 +19,7 @@ #ifdef HAVE_GETADDRINFO_A #include #endif +#include #ifndef WIN32 #if HAVE_INET_PTON @@ -44,6 +45,7 @@ bool fNameLookup = DEFAULT_NAME_LOOKUP; // Need ample time for negotiation for very slow proxies such as Tor (milliseconds) static const int SOCKS5_RECV_TIMEOUT = 20 * 1000; +static std::atomic interruptSocks5Recv(false); enum Network ParseNetwork(std::string net) { boost::to_lower(net); @@ -206,7 +208,7 @@ struct timeval MillisToTimeval(int64_t nTimeout) /** * Read bytes from socket. This will either read the full number of bytes requested * or return False on error or timeout. - * This function can be interrupted by boost thread interrupt. + * This function can be interrupted by calling InterruptSocks5() * * @param data Buffer to receive into * @param len Length of data to receive @@ -246,7 +248,8 @@ bool static InterruptibleRecv(char* data, size_t len, int timeout, SOCKET& hSock return false; } } - boost::this_thread::interruption_point(); + if (interruptSocks5Recv) + return false; curTime = GetTimeMillis(); } return len == 0; @@ -715,3 +718,8 @@ bool SetSocketNonBlocking(SOCKET& hSocket, bool fNonBlocking) return true; } + +void InterruptSocks5(bool interrupt) +{ + interruptSocks5Recv = interrupt; +} diff --git a/src/netbase.h b/src/netbase.h index eb39d1657..9ff8102bd 100644 --- a/src/netbase.h +++ b/src/netbase.h @@ -63,5 +63,6 @@ bool SetSocketNonBlocking(SOCKET& hSocket, bool fNonBlocking); * Convert milliseconds to a struct timeval for e.g. select. */ struct timeval MillisToTimeval(int64_t nTimeout); +void InterruptSocks5(bool interrupt); #endif // BITCOIN_NETBASE_H