diff options
author | Cory Fields <cory-nospam-@coryfields.com> | 2016-12-27 17:13:31 -0500 |
---|---|---|
committer | Cory Fields <cory-nospam-@coryfields.com> | 2017-01-03 17:56:21 -0500 |
commit | 8b3159ef0a912da67c545a3d24f4558f8df866e4 (patch) | |
tree | d98a7bc50b3b21faec735afd103d34ca22b54936 /src | |
parent | 5cb0fcee8137d6de8d2b9525aa45fd11ab2231c8 (diff) |
net: make proxy receives interruptible
Diffstat (limited to 'src')
-rw-r--r-- | src/net.cpp | 2 | ||||
-rw-r--r-- | src/netbase.cpp | 12 | ||||
-rw-r--r-- | src/netbase.h | 1 |
3 files changed, 13 insertions, 2 deletions
diff --git a/src/net.cpp b/src/net.cpp index bbfada4301..7e16e2382f 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 da94fd4d13..87c7abd7c1 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -19,6 +19,7 @@ #ifdef HAVE_GETADDRINFO_A #include <netdb.h> #endif +#include <atomic> #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<bool> 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 eb39d16578..9ff8102bd7 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 |