diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2013-10-20 19:06:53 -0700 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2013-10-20 19:06:53 -0700 |
commit | 749230d05c6e27cfcacbe913411050094b1b4d23 (patch) | |
tree | 5eedb44f1ca728ded316c6441dbfca4c61794ee6 | |
parent | 34f72ad6efb53b9da44576fcdbf8ce4ffdd7fcb8 (diff) | |
parent | 7d38af3c493f9ea24c722ec2e6d3c51f4e851364 (diff) |
Merge pull request #2840 from sipa/nosendlock
Allow SendMessages to run partially without cs_main
-rw-r--r-- | src/main.cpp | 57 | ||||
-rw-r--r-- | src/net.cpp | 3 |
2 files changed, 38 insertions, 22 deletions
diff --git a/src/main.cpp b/src/main.cpp index ceb1e80d2c..a5a0f031af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3234,6 +3234,8 @@ void static ProcessGetData(CNode* pfrom) vector<CInv> vNotFound; + LOCK(cs_main); + while (it != pfrom->vRecvGetData.end()) { // Don't bother if send buffer is too full to respond anyway if (pfrom->nSendSize >= SendBufferSize()) @@ -3406,7 +3408,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) pfrom->fClient = !(pfrom->nServices & NODE_NETWORK); - AddTimeData(pfrom->addr, nTime); // Change version pfrom->PushMessage("verack"); @@ -3448,6 +3449,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) LogPrintf("receive version message: version %d, blocks=%d, us=%s, them=%s, peer=%s\n", pfrom->nVersion, pfrom->nStartingHeight, addrMe.ToString().c_str(), addrFrom.ToString().c_str(), pfrom->addr.ToString().c_str()); + LOCK(cs_main); + AddTimeData(pfrom->addr, nTime); cPeerBlockCounts.input(pfrom->nStartingHeight); } @@ -3551,6 +3554,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) break; } } + + LOCK(cs_main); + for (unsigned int nInv = 0; nInv < vInv.size(); nInv++) { const CInv &inv = vInv[nInv]; @@ -3608,6 +3614,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) uint256 hashStop; vRecv >> locator >> hashStop; + LOCK(cs_main); + // Find the last block the caller has in the main chain CBlockIndex* pindex = chainActive.FindFork(locator); @@ -3642,6 +3650,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) uint256 hashStop; vRecv >> locator >> hashStop; + LOCK(cs_main); + CBlockIndex* pindex = NULL; if (locator.IsNull()) { @@ -3683,6 +3693,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) CInv inv(MSG_TX, tx.GetHash()); pfrom->AddInventoryKnown(inv); + LOCK(cs_main); + bool fMissingInputs = false; CValidationState state; if (mempool.accept(state, tx, true, &fMissingInputs)) @@ -3757,6 +3769,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) CInv inv(MSG_BLOCK, block.GetHash()); pfrom->AddInventoryKnown(inv); + LOCK(cs_main); + CValidationState state; if (ProcessBlock(state, pfrom, &block)) mapAlreadyAskedFor.erase(inv); @@ -3778,6 +3792,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) else if (strCommand == "mempool") { + LOCK(cs_main); + std::vector<uint256> vtxid; LOCK2(mempool.cs, pfrom->cs_filter); mempool.queryHashes(vtxid); @@ -4043,10 +4059,7 @@ bool ProcessMessages(CNode* pfrom) bool fRet = false; try { - { - LOCK(cs_main); - fRet = ProcessMessage(pfrom, strCommand, vRecv); - } + fRet = ProcessMessage(pfrom, strCommand, vRecv); boost::this_thread::interruption_point(); } catch (std::ios_base::failure& e) @@ -4089,8 +4102,7 @@ bool ProcessMessages(CNode* pfrom) bool SendMessages(CNode* pto, bool fSendTrickle) { - TRY_LOCK(cs_main, lockMain); - if (lockMain) { + { // Don't send anything until we get their version message if (pto->nVersion == 0) return true; @@ -4125,20 +4137,6 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } } - // Start block sync - if (pto->fStartSync && !fImporting && !fReindex) { - pto->fStartSync = false; - PushGetBlocks(pto, chainActive.Tip(), uint256(0)); - } - - // Resend wallet transactions that haven't gotten in a block yet - // Except during reindex, importing and IBD, when old wallet - // transactions become unconfirmed and spams other nodes. - if (!fReindex && !fImporting && !IsInitialBlockDownload()) - { - ResendWalletTransactions(); - } - // Address refresh broadcast static int64 nLastRebroadcast; if (!IsInitialBlockDownload() && (GetTime() - nLastRebroadcast > 24 * 60 * 60)) @@ -4189,6 +4187,23 @@ bool SendMessages(CNode* pto, bool fSendTrickle) pto->PushMessage("addr", vAddr); } + TRY_LOCK(cs_main, lockMain); + if (!lockMain) + return true; + + // Start block sync + if (pto->fStartSync && !fImporting && !fReindex) { + pto->fStartSync = false; + PushGetBlocks(pto, chainActive.Tip(), uint256(0)); + } + + // Resend wallet transactions that haven't gotten in a block yet + // Except during reindex, importing and IBD, when old wallet + // transactions become unconfirmed and spams other nodes. + if (!fReindex && !fImporting && !IsInitialBlockDownload()) + { + ResendWalletTransactions(); + } // // Message: inventory diff --git a/src/net.cpp b/src/net.cpp index e0fb3eea68..dd7bf283a9 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -801,7 +801,8 @@ void ThreadSocketHandler() vNodesDisconnected.push_back(pnode); } } - + } + { // Delete disconnected nodes list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected; BOOST_FOREACH(CNode* pnode, vNodesDisconnectedCopy) |