| 2421 | } |
| 2422 | |
| 2423 | void CConnman::Stop() |
| 2424 | { |
| 2425 | if (threadMessageHandler.joinable()) |
| 2426 | threadMessageHandler.join(); |
| 2427 | if (threadOpenConnections.joinable()) |
| 2428 | threadOpenConnections.join(); |
| 2429 | if (threadOpenAddedConnections.joinable()) |
| 2430 | threadOpenAddedConnections.join(); |
| 2431 | if (threadDNSAddressSeed.joinable()) |
| 2432 | threadDNSAddressSeed.join(); |
| 2433 | if (threadSocketHandler.joinable()) |
| 2434 | threadSocketHandler.join(); |
| 2435 | |
| 2436 | if (fAddressesInitialized) |
| 2437 | { |
| 2438 | DumpData(); |
| 2439 | fAddressesInitialized = false; |
| 2440 | } |
| 2441 | |
| 2442 | // Close sockets |
| 2443 | for (CNode* pnode : vNodes) |
| 2444 | pnode->CloseSocketDisconnect(); |
| 2445 | for (ListenSocket& hListenSocket : vhListenSocket) |
| 2446 | if (hListenSocket.socket != INVALID_SOCKET) |
| 2447 | if (!CloseSocket(hListenSocket.socket)) |
| 2448 | LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError())); |
| 2449 | |
| 2450 | // clean up some globals (to help leak detection) |
| 2451 | for (CNode *pnode : vNodes) { |
| 2452 | DeleteNode(pnode); |
| 2453 | } |
| 2454 | for (CNode *pnode : vNodesDisconnected) { |
| 2455 | DeleteNode(pnode); |
| 2456 | } |
| 2457 | vNodes.clear(); |
| 2458 | vNodesDisconnected.clear(); |
| 2459 | vhListenSocket.clear(); |
| 2460 | semOutbound.reset(); |
| 2461 | semAddnode.reset(); |
| 2462 | } |
| 2463 | |
| 2464 | void CConnman::DeleteNode(CNode* pnode) |
| 2465 | { |
nothing calls this directly
no test coverage detected