From 7479b63d9109ccaf3708a92dc65dc24556576551 Mon Sep 17 00:00:00 2001 From: Patrick Strateman Date: Mon, 24 Sep 2018 16:36:58 -0400 Subject: [PATCH] Move DisconnectNodes logic to private method. --- src/net.cpp | 124 ++++++++++++++++++++++++++-------------------------- src/net.h | 1 + 2 files changed, 64 insertions(+), 61 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index 767275247d0..006e094fc77 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1153,6 +1153,68 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) { } } +void CConnman::DisconnectNodes() +{ + { + LOCK(cs_vNodes); + + if (!fNetworkActive) { + // Disconnect any connected nodes + for (CNode* pnode : vNodes) { + if (!pnode->fDisconnect) { + LogPrint(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId()); + pnode->fDisconnect = true; + } + } + } + + // Disconnect unused nodes + std::vector vNodesCopy = vNodes; + for (CNode* pnode : vNodesCopy) + { + if (pnode->fDisconnect) + { + // remove from vNodes + vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end()); + + // release outbound grant (if any) + pnode->grantOutbound.Release(); + + // close socket and cleanup + pnode->CloseSocketDisconnect(); + + // hold in disconnected pool until all refs are released + pnode->Release(); + vNodesDisconnected.push_back(pnode); + } + } + } + { + // Delete disconnected nodes + std::list vNodesDisconnectedCopy = vNodesDisconnected; + for (CNode* pnode : vNodesDisconnectedCopy) + { + // wait until threads are done using it + if (pnode->GetRefCount() <= 0) { + bool fDelete = false; + { + TRY_LOCK(pnode->cs_inventory, lockInv); + if (lockInv) { + TRY_LOCK(pnode->cs_vSend, lockSend); + if (lockSend) { + fDelete = true; + } + } + } + if (fDelete) { + vNodesDisconnected.remove(pnode); + DeleteNode(pnode); + } + } + } + } +} + void CConnman::NotifyNumConnectionsChanged() { size_t vNodesSize; @@ -1171,67 +1233,7 @@ void CConnman::ThreadSocketHandler() { while (!interruptNet) { - // - // Disconnect nodes - // - { - LOCK(cs_vNodes); - - if (!fNetworkActive) { - // Disconnect any connected nodes - for (CNode* pnode : vNodes) { - if (!pnode->fDisconnect) { - LogPrint(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId()); - pnode->fDisconnect = true; - } - } - } - - // Disconnect unused nodes - std::vector vNodesCopy = vNodes; - for (CNode* pnode : vNodesCopy) - { - if (pnode->fDisconnect) - { - // remove from vNodes - vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end()); - - // release outbound grant (if any) - pnode->grantOutbound.Release(); - - // close socket and cleanup - pnode->CloseSocketDisconnect(); - - // hold in disconnected pool until all refs are released - pnode->Release(); - vNodesDisconnected.push_back(pnode); - } - } - } - { - // Delete disconnected nodes - std::list vNodesDisconnectedCopy = vNodesDisconnected; - for (CNode* pnode : vNodesDisconnectedCopy) - { - // wait until threads are done using it - if (pnode->GetRefCount() <= 0) { - bool fDelete = false; - { - TRY_LOCK(pnode->cs_inventory, lockInv); - if (lockInv) { - TRY_LOCK(pnode->cs_vSend, lockSend); - if (lockSend) { - fDelete = true; - } - } - } - if (fDelete) { - vNodesDisconnected.remove(pnode); - DeleteNode(pnode); - } - } - } - } + DisconnectNodes(); NotifyNumConnectionsChanged(); // diff --git a/src/net.h b/src/net.h index ba5cd4f5c7d..f6af2a3babe 100644 --- a/src/net.h +++ b/src/net.h @@ -336,6 +336,7 @@ private: void ThreadOpenConnections(std::vector connect); void ThreadMessageHandler(); void AcceptConnection(const ListenSocket& hListenSocket); + void DisconnectNodes(); void NotifyNumConnectionsChanged(); void ThreadSocketHandler(); void ThreadDNSAddressSeed();