MCPcopy Create free account
hub / github.com/bitcoinxt/bitcoinxt / ThreadSocketHandler

Function ThreadSocketHandler

src/net.cpp:722–1089  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

720static list<CNode*> vNodesDisconnected;
721
722void 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 {

Callers

nothing calls this directly

Calls 5

NetworkErrorStringFunction · 0.85
MilliSleepFunction · 0.85
AddRefMethod · 0.80
sizeMethod · 0.45
ReleaseMethod · 0.45

Tested by

no test coverage detected