@@ -1240,28 +1240,24 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
1240
1240
}
1241
1241
}
1242
1242
1243
- void CConnman::ThreadSocketHandler ()
1244
- {
1245
- unsigned int nPrevNodeCount = 0 ;
1246
- while (!interruptNet)
1243
+ void CConnman::DisconnectAndDeleteNodes (bool fDisconectAll )
1247
1244
{
1248
1245
//
1249
1246
// Disconnect nodes
1250
1247
//
1251
1248
{
1252
1249
LOCK (cs_vNodes);
1253
- // Disconnect unused nodes
1254
1250
std::vector<CNode*> vNodesCopy = vNodes;
1255
1251
for (CNode* pnode : vNodesCopy)
1256
1252
{
1257
- if (pnode->fDisconnect )
1253
+ if (pnode->fDisconnect || fDisconectAll )
1258
1254
{
1259
1255
if (fLogIPs ) {
1260
- LogPrintf (" ThreadSocketHandler -- removing node: peer=%d addr=%s nRefCount=%d fInbound=%d fMasternode=%d\n " ,
1261
- pnode->GetId (), pnode->addr .ToString (), pnode->GetRefCount (), pnode->fInbound , pnode->fMasternode );
1256
+ LogPrintf (" %s -- removing node: peer=%d addr=%s nRefCount=%d fInbound=%d fMasternode=%d\n " ,
1257
+ __func__, pnode->GetId (), pnode->addr .ToString (), pnode->GetRefCount (), pnode->fInbound , pnode->fMasternode );
1262
1258
} else {
1263
- LogPrintf (" ThreadSocketHandler -- removing node: peer=%d nRefCount=%d fInbound=%d fMasternode=%d\n " ,
1264
- pnode->GetId (), pnode->GetRefCount (), pnode->fInbound , pnode->fMasternode );
1259
+ LogPrintf (" %s -- removing node: peer=%d nRefCount=%d fInbound=%d fMasternode=%d\n " ,
1260
+ __func__, pnode->GetId (), pnode->GetRefCount (), pnode->fInbound , pnode->fMasternode );
1265
1261
}
1266
1262
1267
1263
// remove from vNodes
@@ -1280,7 +1276,6 @@ void CConnman::ThreadSocketHandler()
1280
1276
}
1281
1277
}
1282
1278
}
1283
- {
1284
1279
// Delete disconnected nodes
1285
1280
std::list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected;
1286
1281
for (CNode* pnode : vNodesDisconnectedCopy)
@@ -1304,6 +1299,15 @@ void CConnman::ThreadSocketHandler()
1304
1299
}
1305
1300
}
1306
1301
}
1302
+
1303
+ void CConnman::ThreadSocketHandler ()
1304
+ {
1305
+ unsigned int nPrevNodeCount = 0 ;
1306
+ while (!interruptNet)
1307
+ {
1308
+ // Disconnect unused nodes
1309
+ DisconnectAndDeleteNodes (false );
1310
+
1307
1311
size_t vNodesSize;
1308
1312
{
1309
1313
LOCK (cs_vNodes);
@@ -2735,21 +2739,24 @@ void CConnman::Stop()
2735
2739
fAddressesInitialized = false ;
2736
2740
}
2737
2741
2742
+ // Try to disconnect and delete all nodes
2743
+ // TODO: it looks like smth is holding nodes sometimes not releasing references properly,
2744
+ // so we only try a few times here (cause otherwise we might end up waiting forever).
2745
+ for (int i = 0 ; i < 10 ; ++i) {
2746
+ DisconnectAndDeleteNodes (true );
2747
+ if (vNodesDisconnected.empty ()) {
2748
+ // All nodes were disconected and deleted, no need to loop any further
2749
+ break ;
2750
+ }
2751
+ MilliSleep (100 );
2752
+ }
2753
+
2738
2754
// Close sockets
2739
- for (CNode* pnode : vNodes)
2740
- pnode->CloseSocketDisconnect ();
2741
2755
for (ListenSocket& hListenSocket : vhListenSocket)
2742
2756
if (hListenSocket.socket != INVALID_SOCKET)
2743
2757
if (!CloseSocket (hListenSocket.socket ))
2744
2758
LogPrintf (" CloseSocket(hListenSocket) failed with error %s\n " , NetworkErrorString (WSAGetLastError ()));
2745
2759
2746
- // clean up some globals (to help leak detection)
2747
- for (CNode *pnode : vNodes) {
2748
- DeleteNode (pnode);
2749
- }
2750
- for (CNode *pnode : vNodesDisconnected) {
2751
- DeleteNode (pnode);
2752
- }
2753
2760
vNodes.clear ();
2754
2761
vNodesDisconnected.clear ();
2755
2762
vhListenSocket.clear ();
0 commit comments