X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fnet.cpp;h=88a3b436c7fd84328defcbcdf4066be573c85739;hb=ca0816152d91c929b51b2f644fcb9a69797a49fa;hp=8272b255618e032166c797eaaf3e1a54efb29f64;hpb=f8dcd5ca6f55ad49807cf7491c1f153f6158400e;p=novacoin.git diff --git a/src/net.cpp b/src/net.cpp index 8272b25..88a3b43 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -3,13 +3,13 @@ // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. -#include "headers.h" #include "irc.h" #include "db.h" #include "net.h" #include "init.h" #include "strlcpy.h" #include "addrman.h" +#include "ui_interface.h" #ifdef WIN32 #include @@ -35,7 +35,7 @@ void ThreadOpenAddedConnections2(void* parg); void ThreadMapPort2(void* parg); #endif void ThreadDNSAddressSeed2(void* parg); -bool OpenNetworkConnection(const CAddress& addrConnect); +bool OpenNetworkConnection(const CAddress& addrConnect, bool fUseGrant = true); @@ -64,10 +64,7 @@ map mapAlreadyAskedFor; set setservAddNodeAddresses; CCriticalSection cs_setservAddNodeAddresses; -static CWaitableCriticalSection csOutbound; -static int nOutbound = 0; -static CConditionVariable condOutbound; - +static CSemaphore *semOutbound = NULL; unsigned short GetListenPort() { @@ -162,14 +159,14 @@ bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const cha } if (pszKeyword == NULL) break; - if (strLine.find(pszKeyword) != -1) + if (strLine.find(pszKeyword) != string::npos) { strLine = strLine.substr(strLine.find(pszKeyword) + strlen(pszKeyword)); break; } } closesocket(hSocket); - if (strLine.find("<") != -1) + if (strLine.find("<") != string::npos) strLine = strLine.substr(0, strLine.find("<")); strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r")); while (strLine.size() > 0 && isspace(strLine[strLine.size()-1])) @@ -368,10 +365,6 @@ CNode* ConnectNode(CAddress addrConnect, int64 nTimeout) LOCK(cs_vNodes); vNodes.push_back(pnode); } - { - WAITABLE_LOCK(csOutbound); - nOutbound++; - } pnode->nTimeConnected = GetTime(); return pnode; @@ -498,7 +491,7 @@ void ThreadSocketHandler2(void* parg) { printf("ThreadSocketHandler started\n"); list vNodesDisconnected; - int nPrevNodeCount = 0; + unsigned int nPrevNodeCount = 0; loop { @@ -517,14 +510,9 @@ void ThreadSocketHandler2(void* parg) // remove from vNodes vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end()); - if (!pnode->fInbound) - { - WAITABLE_LOCK(csOutbound); - nOutbound--; - - // Connection slot(s) were removed, notify connection creator(s) - NOTIFY(condOutbound); - } + if (pnode->fHasGrant) + semOutbound->post(); + pnode->fHasGrant = false; // close socket and cleanup pnode->CloseSocketDisconnect(); @@ -624,7 +612,7 @@ void ThreadSocketHandler2(void* parg) if (hSocketMax > -1) { printf("socket select error %d\n", nErr); - for (int i = 0; i <= hSocketMax; i++) + for (unsigned int i = 0; i <= hSocketMax; i++) FD_SET(i, &fdsetRecv); } FD_ZERO(&fdsetSend); @@ -1024,7 +1012,7 @@ void ThreadDNSAddressSeed2(void* parg) { printf("Loading addresses from DNS seeds (could take a while)\n"); - for (int seed_idx = 0; seed_idx < ARRAYLEN(strDNSSeed); seed_idx++) { + for (unsigned int seed_idx = 0; seed_idx < ARRAYLEN(strDNSSeed); seed_idx++) { vector vaddr; vector vAdd; if (LookupHost(strDNSSeed[seed_idx][1], vaddr)) @@ -1201,7 +1189,7 @@ void ThreadOpenConnections2(void* parg) { CAddress addr(CService(strAddr, GetDefaultPort(), fAllowDNS)); if (addr.IsValid()) - OpenNetworkConnection(addr); + OpenNetworkConnection(addr, false); for (int i = 0; i < 10 && i < nLoop; i++) { Sleep(500); @@ -1222,25 +1210,19 @@ void ThreadOpenConnections2(void* parg) if (fShutdown) return; - // Limit outbound connections - int nMaxOutbound = min(MAX_OUTBOUND_CONNECTIONS, (int)GetArg("-maxconnections", 125)); + vnThreadsRunning[THREAD_OPENCONNECTIONS]--; - { - WAITABLE_LOCK(csOutbound); - WAIT(condOutbound, fShutdown || nOutbound < nMaxOutbound); - } + semOutbound->wait(); vnThreadsRunning[THREAD_OPENCONNECTIONS]++; if (fShutdown) return; - bool fAddSeeds = false; - // Add seed nodes if IRC isn't working bool fTOR = (fUseProxy && addrProxy.GetPort() == 9050); if (addrman.size()==0 && (GetTime() - nStart > 60 || fTOR) && !fTestNet) { std::vector vAdd; - for (int i = 0; i < ARRAYLEN(pnSeed); i++) + for (unsigned int i = 0; i < ARRAYLEN(pnSeed); i++) { // It'll only connect to one or two seed nodes because once it connects, // it'll get a pile of addresses with newer timestamps. @@ -1260,15 +1242,18 @@ void ThreadOpenConnections2(void* parg) // Choose an address to connect to based on most recently seen // CAddress addrConnect; - int64 nBest = std::numeric_limits::min(); // Only connect to one address per a.b.?.? range. // Do this here so we don't have to critsect vNodes inside mapAddresses critsect. + int nOutbound = 0; set > setConnected; { LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) + BOOST_FOREACH(CNode* pnode, vNodes) { setConnected.insert(pnode->addr.GetGroup()); + if (!pnode->fInbound) + nOutbound++; + } } int64 nANow = GetAdjustedTime(); @@ -1299,6 +1284,8 @@ void ThreadOpenConnections2(void* parg) if (addrConnect.IsValid()) OpenNetworkConnection(addrConnect); + else + semOutbound->post(); } } @@ -1361,6 +1348,7 @@ void ThreadOpenAddedConnections2(void* parg) } BOOST_FOREACH(vector& vserv, vservConnectAddresses) { + semOutbound->wait(); OpenNetworkConnection(CAddress(*(vserv.begin()))); Sleep(500); if (fShutdown) @@ -1376,7 +1364,14 @@ void ThreadOpenAddedConnections2(void* parg) } } -bool OpenNetworkConnection(const CAddress& addrConnect) +bool static ReleaseGrant(bool fUseGrant) { + if (fUseGrant) + semOutbound->post(); + return false; +} + +// only call this function when semOutbound has been waited for +bool OpenNetworkConnection(const CAddress& addrConnect, bool fUseGrant) { // // Initiate outbound network connection @@ -1385,7 +1380,7 @@ bool OpenNetworkConnection(const CAddress& addrConnect) return false; if ((CNetAddr)addrConnect == (CNetAddr)addrLocalHost || !addrConnect.IsIPv4() || FindNode((CNetAddr)addrConnect) || CNode::IsBanned(addrConnect)) - return false; + return ReleaseGrant(fUseGrant); vnThreadsRunning[THREAD_OPENCONNECTIONS]--; CNode* pnode = ConnectNode(addrConnect); @@ -1393,7 +1388,13 @@ bool OpenNetworkConnection(const CAddress& addrConnect) if (fShutdown) return false; if (!pnode) - return false; + return ReleaseGrant(fUseGrant); + if (pnode->fHasGrant) { + // node already has connection grant, release the one that was passed to us + ReleaseGrant(fUseGrant); + } else { + pnode->fHasGrant = fUseGrant; + } pnode->fNetworkNode = true; return true; @@ -1570,6 +1571,12 @@ bool BindListenPort(string& strError) void StartNode(void* parg) { + if (semOutbound == NULL) { + // initialize semaphore + int nMaxOutbound = min(MAX_OUTBOUND_CONNECTIONS, (int)GetArg("-maxconnections", 125)); + semOutbound = new CSemaphore(nMaxOutbound); + } + #ifdef USE_UPNP #if USE_UPNP fUseUPnP = GetBoolArg("-upnp", true); @@ -1588,12 +1595,16 @@ void StartNode(void* parg) { vector vaddr; if (LookupHost(pszHostName, vaddr)) + { BOOST_FOREACH (const CNetAddr &addr, vaddr) + { if (!addr.IsLocal()) { addrLocalHost.SetIP(addr); break; } + } + } } #else // Get local host ip @@ -1692,7 +1703,8 @@ bool StopNode() fShutdown = true; nTransactionsUpdated++; int64 nStart = GetTime(); - NOTIFY_ALL(condOutbound); + for (int i=0; ipost(); do { int nThreadsRunning = 0;