diff --git a/src/net.cpp b/src/net.cpp index b71c538862f5..5987b915f383 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1239,9 +1239,9 @@ void CConnman::ThreadSocketHandler() { LOCK(cs_vNodes); // Disconnect unused nodes - std::vector vNodesCopy = vNodes; - for (CNode* pnode : vNodesCopy) + for (auto it = vNodes.begin(); it != vNodes.end(); ) { + CNode* pnode = *it; if (pnode->fDisconnect) { if (fLogIPs) { @@ -1253,7 +1253,7 @@ void CConnman::ThreadSocketHandler() } // remove from vNodes - vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end()); + it = vNodes.erase(it); // release outbound grant (if any) pnode->grantOutbound.Release(); @@ -1265,17 +1265,20 @@ void CConnman::ThreadSocketHandler() // hold in disconnected pool until all refs are released pnode->Release(); vNodesDisconnected.push_back(pnode); + } else { + ++it; } } } { // Delete disconnected nodes std::list vNodesDisconnectedCopy = vNodesDisconnected; - for (CNode* pnode : vNodesDisconnectedCopy) + for (auto it = vNodesDisconnected.begin(); it != vNodesDisconnected.end(); ) { + CNode* pnode = *it; // wait until threads are done using it + bool fDelete = false; if (pnode->GetRefCount() <= 0) { - bool fDelete = false; { TRY_LOCK(pnode->cs_inventory, lockInv); if (lockInv) { @@ -1286,10 +1289,13 @@ void CConnman::ThreadSocketHandler() } } if (fDelete) { - vNodesDisconnected.remove(pnode); + it = vNodesDisconnected.erase(it); DeleteNode(pnode); } } + if (!fDelete) { + ++it; + } } } size_t vNodesSize; @@ -3413,6 +3419,7 @@ std::vector CConnman::CopyNodeVector(std::function vecNodesCopy; LOCK(cs_vNodes); + vecNodesCopy.reserve(vNodes.size()); for(size_t i = 0; i < vNodes.size(); ++i) { CNode* pnode = vNodes[i]; if (!cond(pnode)) @@ -3430,7 +3437,6 @@ std::vector CConnman::CopyNodeVector() void CConnman::ReleaseNodeVector(const std::vector& vecNodes) { - LOCK(cs_vNodes); for(size_t i = 0; i < vecNodes.size(); ++i) { CNode* pnode = vecNodes[i]; pnode->Release(); diff --git a/src/net.h b/src/net.h index 8e8f9edb9aae..25f14a55253c 100644 --- a/src/net.h +++ b/src/net.h @@ -770,7 +770,7 @@ class CNode size_t nSendSize; // total size of all vSendMsg entries size_t nSendOffset; // offset inside the first vSendMsg already sent uint64_t nSendBytes; - std::deque> vSendMsg; + std::list> vSendMsg; CCriticalSection cs_vSend; CCriticalSection cs_hSocket; CCriticalSection cs_vRecv; diff --git a/src/net_processing.cpp b/src/net_processing.cpp index bcf4521ea3c8..4e0d7322cb04 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3812,8 +3812,12 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic& interruptM // std::vector vInv; { + size_t reserve = std::min(pto->setInventoryTxToSend.size(), INVENTORY_BROADCAST_MAX_PER_1MB_BLOCK * MaxBlockSize(true) / 1000000); + reserve = std::max(reserve, pto->vInventoryBlockToSend.size()); + reserve = std::min(reserve, MAX_INV_SZ); + vInv.reserve(reserve); + LOCK(pto->cs_inventory); - vInv.reserve(std::max(pto->vInventoryBlockToSend.size(), INVENTORY_BROADCAST_MAX_PER_1MB_BLOCK * MaxBlockSize(true) / 1000000)); // Add blocks for (const uint256& hash : pto->vInventoryBlockToSend) { diff --git a/src/utiltime.cpp b/src/utiltime.cpp index f9d910dd19f4..735495dca0fd 100644 --- a/src/utiltime.cpp +++ b/src/utiltime.cpp @@ -15,6 +15,8 @@ #include #include +#include + static std::atomic nMockTime(0); //!< For unit testing int64_t GetTime() @@ -39,16 +41,14 @@ int64_t GetMockTime() int64_t GetTimeMillis() { - int64_t now = (boost::posix_time::microsec_clock::universal_time() - - boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds(); + int64_t now = std::chrono::time_point_cast(std::chrono::system_clock::now()).time_since_epoch().count(); assert(now > 0); return now; } int64_t GetTimeMicros() { - int64_t now = (boost::posix_time::microsec_clock::universal_time() - - boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds(); + int64_t now = std::chrono::time_point_cast(std::chrono::system_clock::now()).time_since_epoch().count(); assert(now > 0); return now; }