net: make proxy receives interruptible

This commit is contained in:
Cory Fields 2016-12-27 17:13:31 -05:00
parent 5cb0fcee81
commit 8b3159ef0a
3 changed files with 13 additions and 2 deletions

View file

@ -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++)

View file

@ -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;
}

View file

@ -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