Browse Source

RAII wrapper for CNode*

0.13
Patrick Strateman 9 years ago
parent
commit
1317cd1928
  1. 25
      src/net.cpp

25
src/net.cpp

@ -775,12 +775,23 @@ void SocketSendData(CNode *pnode)
static list<CNode*> vNodesDisconnected; static list<CNode*> vNodesDisconnected;
static bool ReverseCompareNodeMinPingTime(CNode *a, CNode *b) class CNodeRef {
public:
CNodeRef(CNode *pnode) : _pnode(pnode) {_pnode->AddRef();}
~CNodeRef() {_pnode->Release();}
CNode& operator *() const {return *_pnode;};
CNode* operator ->() const {return _pnode;};
private:
CNode *_pnode;
};
static bool ReverseCompareNodeMinPingTime(const CNodeRef &a, const CNodeRef &b)
{ {
return a->nMinPingUsecTime > b->nMinPingUsecTime; return a->nMinPingUsecTime > b->nMinPingUsecTime;
} }
static bool ReverseCompareNodeTimeConnected(CNode *a, CNode *b) static bool ReverseCompareNodeTimeConnected(const CNodeRef &a, const CNodeRef &b)
{ {
return a->nTimeConnected > b->nTimeConnected; return a->nTimeConnected > b->nTimeConnected;
} }
@ -795,7 +806,7 @@ public:
GetRandBytes(vchSecretKey.data(), vchSecretKey.size()); GetRandBytes(vchSecretKey.data(), vchSecretKey.size());
} }
bool operator()(CNode *a, CNode *b) bool operator()(const CNodeRef &a, const CNodeRef &b)
{ {
std::vector<unsigned char> vchGroupA, vchGroupB; std::vector<unsigned char> vchGroupA, vchGroupB;
CSHA256 hashA, hashB; CSHA256 hashA, hashB;
@ -818,7 +829,7 @@ public:
}; };
static bool AttemptToEvictConnection(bool fPreferNewConnection) { static bool AttemptToEvictConnection(bool fPreferNewConnection) {
std::vector<CNode*> vEvictionCandidates; std::vector<CNodeRef> vEvictionCandidates;
{ {
LOCK(cs_vNodes); LOCK(cs_vNodes);
@ -831,7 +842,7 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) {
continue; continue;
if (node->addr.IsLocal()) if (node->addr.IsLocal())
continue; continue;
vEvictionCandidates.push_back(node); vEvictionCandidates.push_back(CNodeRef(node));
} }
} }
@ -859,8 +870,8 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) {
// Identify CNetAddr with the most connections // Identify CNetAddr with the most connections
CNetAddr naMostConnections; CNetAddr naMostConnections;
unsigned int nMostConnections = 0; unsigned int nMostConnections = 0;
std::map<CNetAddr, std::vector<CNode*> > mapAddrCounts; std::map<CNetAddr, std::vector<CNodeRef> > mapAddrCounts;
BOOST_FOREACH(CNode *node, vEvictionCandidates) { BOOST_FOREACH(const CNodeRef &node, vEvictionCandidates) {
mapAddrCounts[node->addr].push_back(node); mapAddrCounts[node->addr].push_back(node);
if (mapAddrCounts[node->addr].size() > nMostConnections) { if (mapAddrCounts[node->addr].size() > nMostConnections) {

Loading…
Cancel
Save