mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-21 14:34:49 +01:00
Move DisconnectNodes logic to private method.
This commit is contained in:
parent
edb5350c32
commit
7479b63d91
2 changed files with 64 additions and 61 deletions
124
src/net.cpp
124
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<CNode*> 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<CNode*> 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()
|
void CConnman::NotifyNumConnectionsChanged()
|
||||||
{
|
{
|
||||||
size_t vNodesSize;
|
size_t vNodesSize;
|
||||||
|
@ -1171,67 +1233,7 @@ void CConnman::ThreadSocketHandler()
|
||||||
{
|
{
|
||||||
while (!interruptNet)
|
while (!interruptNet)
|
||||||
{
|
{
|
||||||
//
|
DisconnectNodes();
|
||||||
// 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<CNode*> 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<CNode*> 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NotifyNumConnectionsChanged();
|
NotifyNumConnectionsChanged();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -336,6 +336,7 @@ private:
|
||||||
void ThreadOpenConnections(std::vector<std::string> connect);
|
void ThreadOpenConnections(std::vector<std::string> connect);
|
||||||
void ThreadMessageHandler();
|
void ThreadMessageHandler();
|
||||||
void AcceptConnection(const ListenSocket& hListenSocket);
|
void AcceptConnection(const ListenSocket& hListenSocket);
|
||||||
|
void DisconnectNodes();
|
||||||
void NotifyNumConnectionsChanged();
|
void NotifyNumConnectionsChanged();
|
||||||
void ThreadSocketHandler();
|
void ThreadSocketHandler();
|
||||||
void ThreadDNSAddressSeed();
|
void ThreadDNSAddressSeed();
|
||||||
|
|
Loading…
Add table
Reference in a new issue