| 720 | static list<CNode*> vNodesDisconnected; |
| 721 | |
| 722 | void ThreadSocketHandler() |
| 723 | { |
| 724 | unsigned int nPrevNodeCount = 0; |
| 725 | |
| 726 | |
| 727 | /* |
| 728 | * int progress is incremented if something happens. If it is zero at the bottom |
| 729 | * of the loop, we delay. This solves spin loop issues where the select does not |
| 730 | * block but no bytes can be transferred (traffic shaping limited, for example). |
| 731 | */ |
| 732 | int progress; |
| 733 | while (true) |
| 734 | { |
| 735 | progress = 0; |
| 736 | // |
| 737 | // Disconnect nodes |
| 738 | // |
| 739 | { |
| 740 | LOCK(cs_vNodes); |
| 741 | // Disconnect unused nodes |
| 742 | vector<CNode*> vNodesCopy = vNodes; |
| 743 | BOOST_FOREACH(CNode* pnode, vNodesCopy) |
| 744 | { |
| 745 | if (pnode->fDisconnect || |
| 746 | (pnode->GetRefCount() <= 0 && pnode->vRecvMsg.empty() && pnode->nSendSize == 0 && pnode->ssSend.empty())) |
| 747 | { |
| 748 | // remove from vNodes |
| 749 | vNodes.erase(remove(vNodes.begin(), vNodes.end(), pnode), vNodes.end()); |
| 750 | |
| 751 | // release outbound grant (if any) |
| 752 | pnode->grantOutbound.Release(); |
| 753 | |
| 754 | // close socket and cleanup |
| 755 | pnode->CloseSocketDisconnect(); |
| 756 | |
| 757 | // hold in disconnected pool until all refs are released |
| 758 | if (pnode->fNetworkNode || pnode->fInbound) |
| 759 | pnode->Release(); |
| 760 | vNodesDisconnected.push_back(pnode); |
| 761 | } |
| 762 | } |
| 763 | } |
| 764 | { |
| 765 | // Delete disconnected nodes |
| 766 | list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected; |
| 767 | BOOST_FOREACH(CNode* pnode, vNodesDisconnectedCopy) |
| 768 | { |
| 769 | // wait until threads are done using it |
| 770 | if (pnode->GetRefCount() <= 0) |
| 771 | { |
| 772 | bool fDelete = false; |
| 773 | { |
| 774 | TRY_LOCK(pnode->cs_vSend, lockSend); |
| 775 | if (lockSend) |
| 776 | { |
| 777 | TRY_LOCK(pnode->cs_vRecvMsg, lockRecv); |
| 778 | if (lockRecv) |
| 779 | { |
nothing calls this directly
no test coverage detected