Changeset View
Changeset View
Standalone View
Standalone View
src/net.cpp
Show First 20 Lines • Show All 1,224 Lines • ▼ Show 20 Lines | void CConnman::AcceptConnection(const ListenSocket &hListenSocket) { | ||||
LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToString()); | LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToString()); | ||||
{ | { | ||||
LOCK(cs_vNodes); | LOCK(cs_vNodes); | ||||
vNodes.push_back(pnode); | vNodes.push_back(pnode); | ||||
} | } | ||||
} | } | ||||
void CConnman::NotifyNumConnectionsChanged() { | void CConnman::DisconnectNodes() { | ||||
size_t vNodesSize; | |||||
{ | |||||
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); | LOCK(cs_vNodes); | ||||
if (!fNetworkActive) { | if (!fNetworkActive) { | ||||
// Disconnect any connected nodes | // Disconnect any connected nodes | ||||
for (CNode *pnode : vNodes) { | for (CNode *pnode : vNodes) { | ||||
if (!pnode->fDisconnect) { | if (!pnode->fDisconnect) { | ||||
LogPrint(BCLog::NET, | LogPrint(BCLog::NET, | ||||
"Network not active, dropping peer=%d\n", | "Network not active, dropping peer=%d\n", | ||||
pnode->GetId()); | pnode->GetId()); | ||||
pnode->fDisconnect = true; | pnode->fDisconnect = true; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
// Disconnect unused nodes | // Disconnect unused nodes | ||||
std::vector<CNode *> vNodesCopy = vNodes; | std::vector<CNode *> vNodesCopy = vNodes; | ||||
for (CNode *pnode : vNodesCopy) { | for (CNode *pnode : vNodesCopy) { | ||||
if (pnode->fDisconnect) { | if (pnode->fDisconnect) { | ||||
// remove from vNodes | // remove from vNodes | ||||
vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), | vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), | ||||
vNodes.end()); | vNodes.end()); | ||||
// release outbound grant (if any) | // release outbound grant (if any) | ||||
pnode->grantOutbound.Release(); | pnode->grantOutbound.Release(); | ||||
// close socket and cleanup | // close socket and cleanup | ||||
pnode->CloseSocketDisconnect(); | pnode->CloseSocketDisconnect(); | ||||
// hold in disconnected pool until all refs are released | // hold in disconnected pool until all refs are released | ||||
pnode->Release(); | pnode->Release(); | ||||
vNodesDisconnected.push_back(pnode); | vNodesDisconnected.push_back(pnode); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
{ | { | ||||
// Delete disconnected nodes | // Delete disconnected nodes | ||||
std::list<CNode *> vNodesDisconnectedCopy = vNodesDisconnected; | std::list<CNode *> vNodesDisconnectedCopy = vNodesDisconnected; | ||||
for (CNode *pnode : vNodesDisconnectedCopy) { | for (CNode *pnode : vNodesDisconnectedCopy) { | ||||
// wait until threads are done using it | // wait until threads are done using it | ||||
if (pnode->GetRefCount() <= 0) { | if (pnode->GetRefCount() <= 0) { | ||||
bool fDelete = false; | bool fDelete = false; | ||||
{ | { | ||||
TRY_LOCK(pnode->cs_inventory, lockInv); | TRY_LOCK(pnode->cs_inventory, lockInv); | ||||
if (lockInv) { | if (lockInv) { | ||||
TRY_LOCK(pnode->cs_vSend, lockSend); | TRY_LOCK(pnode->cs_vSend, lockSend); | ||||
if (lockSend) { | if (lockSend) { | ||||
fDelete = true; | fDelete = true; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
if (fDelete) { | if (fDelete) { | ||||
vNodesDisconnected.remove(pnode); | vNodesDisconnected.remove(pnode); | ||||
DeleteNode(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(); | NotifyNumConnectionsChanged(); | ||||
// | // | ||||
// Find which sockets have data to receive | // Find which sockets have data to receive | ||||
// | // | ||||
struct timeval timeout; | struct timeval timeout; | ||||
timeout.tv_sec = 0; | timeout.tv_sec = 0; | ||||
// Frequency to poll pnode->vSend | // Frequency to poll pnode->vSend | ||||
▲ Show 20 Lines • Show All 1,804 Lines • Show Last 20 Lines |