diff --git a/src/net.h b/src/net.h --- a/src/net.h +++ b/src/net.h @@ -343,6 +343,7 @@ void ThreadOpenConnections(std::vector connect); void ThreadMessageHandler(); void AcceptConnection(const ListenSocket &hListenSocket); + void DisconnectNodes(); void NotifyNumConnectionsChanged(); void ThreadSocketHandler(); void ThreadDNSAddressSeed(); diff --git a/src/net.cpp b/src/net.cpp --- a/src/net.cpp +++ b/src/net.cpp @@ -1230,83 +1230,84 @@ } } -void CConnman::NotifyNumConnectionsChanged() { - size_t vNodesSize; +void CConnman::DisconnectNodes() { { LOCK(cs_vNodes); - vNodesSize = vNodes.size(); - } - if (vNodesSize != nPrevNodeCount) { - nPrevNodeCount = vNodesSize; - if (clientInterface) { - clientInterface->NotifyNumConnectionsChanged(vNodesSize); - } - } -} -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; - } + 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()); + // 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(); + // release outbound grant (if any) + pnode->grantOutbound.Release(); - // close socket and cleanup - pnode->CloseSocketDisconnect(); + // close socket and cleanup + pnode->CloseSocketDisconnect(); - // hold in disconnected pool until all refs are released - pnode->Release(); - vNodesDisconnected.push_back(pnode); - } + // 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; - } + } + { + // 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); - } + } + if (fDelete) { + vNodesDisconnected.remove(pnode); + DeleteNode(pnode); } } } + } +} + +void CConnman::NotifyNumConnectionsChanged() { + size_t vNodesSize; + { + LOCK(cs_vNodes); + vNodesSize = vNodes.size(); + } + if (vNodesSize != nPrevNodeCount) { + nPrevNodeCount = vNodesSize; + if (clientInterface) { + clientInterface->NotifyNumConnectionsChanged(vNodesSize); + } + } +} + +void CConnman::ThreadSocketHandler() { + while (!interruptNet) { + DisconnectNodes(); NotifyNumConnectionsChanged(); //