| 1153 | } |
| 1154 | |
| 1155 | void CConnman::ThreadSocketHandler() |
| 1156 | { |
| 1157 | unsigned int nPrevNodeCount = 0; |
| 1158 | while (!interruptNet) |
| 1159 | { |
| 1160 | // |
| 1161 | // Disconnect nodes |
| 1162 | // |
| 1163 | { |
| 1164 | LOCK(cs_vNodes); |
| 1165 | |
| 1166 | if (!fNetworkActive) { |
| 1167 | // Disconnect any connected nodes |
| 1168 | for (CNode* pnode : vNodes) { |
| 1169 | if (!pnode->fDisconnect) { |
| 1170 | LogPrint(BCLog::NET, "Network not active, dropping peer=%d\n", pnode->GetId()); |
| 1171 | pnode->fDisconnect = true; |
| 1172 | } |
| 1173 | } |
| 1174 | } |
| 1175 | |
| 1176 | // Disconnect unused nodes |
| 1177 | std::vector<CNode*> vNodesCopy = vNodes; |
| 1178 | for (CNode* pnode : vNodesCopy) |
| 1179 | { |
| 1180 | if (pnode->fDisconnect) |
| 1181 | { |
| 1182 | // remove from vNodes |
| 1183 | vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end()); |
| 1184 | |
| 1185 | // release outbound grant (if any) |
| 1186 | pnode->grantOutbound.Release(); |
| 1187 | |
| 1188 | // close socket and cleanup |
| 1189 | pnode->CloseSocketDisconnect(); |
| 1190 | |
| 1191 | // hold in disconnected pool until all refs are released |
| 1192 | pnode->Release(); |
| 1193 | vNodesDisconnected.push_back(pnode); |
| 1194 | } |
| 1195 | } |
| 1196 | } |
| 1197 | { |
| 1198 | // Delete disconnected nodes |
| 1199 | std::list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected; |
| 1200 | for (CNode* pnode : vNodesDisconnectedCopy) |
| 1201 | { |
| 1202 | // wait until threads are done using it |
| 1203 | if (pnode->GetRefCount() <= 0) { |
| 1204 | bool fDelete = false; |
| 1205 | { |
| 1206 | TRY_LOCK(pnode->cs_inventory, lockInv); |
| 1207 | if (lockInv) { |
| 1208 | TRY_LOCK(pnode->cs_vSend, lockSend); |
| 1209 | if (lockSend) { |
| 1210 | fDelete = true; |
| 1211 | } |
| 1212 | } |
nothing calls this directly
no test coverage detected