Move CNode::addrName accesses behind locked accessors

This commit is contained in:
Matt Corallo 2017-02-06 12:04:34 -05:00
parent d8f2b8a8c0
commit 036073bf87
3 changed files with 30 additions and 10 deletions

View file

@ -307,9 +307,11 @@ CNode* CConnman::FindNode(const CSubNet& subNet)
CNode* CConnman::FindNode(const std::string& addrName) CNode* CConnman::FindNode(const std::string& addrName)
{ {
LOCK(cs_vNodes); LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes) BOOST_FOREACH(CNode* pnode, vNodes) {
if (pnode->addrName == addrName) if (pnode->GetAddrName() == addrName) {
return (pnode); return (pnode);
}
}
return NULL; return NULL;
} }
@ -373,9 +375,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
CNode* pnode = FindNode((CService)addrConnect); CNode* pnode = FindNode((CService)addrConnect);
if (pnode) if (pnode)
{ {
if (pnode->addrName.empty()) { pnode->MaybeSetAddrName(std::string(pszDest));
pnode->addrName = std::string(pszDest);
}
CloseSocket(hSocket); CloseSocket(hSocket);
LogPrintf("Failed to open new connection, already connected\n"); LogPrintf("Failed to open new connection, already connected\n");
return NULL; return NULL;
@ -593,6 +593,19 @@ void CConnman::AddWhitelistedRange(const CSubNet &subnet) {
vWhitelistedRange.push_back(subnet); vWhitelistedRange.push_back(subnet);
} }
std::string CNode::GetAddrName() const {
LOCK(cs_addrName);
return addrName;
}
void CNode::MaybeSetAddrName(const std::string& addrNameIn) {
LOCK(cs_addrName);
if (addrName.empty()) {
addrName = addrNameIn;
}
}
#undef X #undef X
#define X(name) stats.name = name #define X(name) stats.name = name
void CNode::copyStats(CNodeStats &stats) void CNode::copyStats(CNodeStats &stats)
@ -608,7 +621,7 @@ void CNode::copyStats(CNodeStats &stats)
X(nLastRecv); X(nLastRecv);
X(nTimeConnected); X(nTimeConnected);
X(nTimeOffset); X(nTimeOffset);
X(addrName); stats.addrName = GetAddrName();
X(nVersion); X(nVersion);
{ {
LOCK(cs_SubVer); LOCK(cs_SubVer);
@ -1798,8 +1811,9 @@ std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo()
if (pnode->addr.IsValid()) { if (pnode->addr.IsValid()) {
mapConnected[pnode->addr] = pnode->fInbound; mapConnected[pnode->addr] = pnode->fInbound;
} }
if (!pnode->addrName.empty()) { std::string addrName = pnode->GetAddrName();
mapConnectedByName[pnode->addrName] = std::make_pair(pnode->fInbound, static_cast<const CService&>(pnode->addr)); if (!addrName.empty()) {
mapConnectedByName[std::move(addrName)] = std::make_pair(pnode->fInbound, static_cast<const CService&>(pnode->addr));
} }
} }
} }

View file

@ -590,7 +590,6 @@ public:
const int64_t nTimeConnected; const int64_t nTimeConnected;
std::atomic<int64_t> nTimeOffset; std::atomic<int64_t> nTimeOffset;
const CAddress addr; const CAddress addr;
std::string addrName;
CService addrLocal; CService addrLocal;
std::atomic<int> nVersion; std::atomic<int> nVersion;
// strSubVer is whatever byte array we read from the wire. However, this field is intended // strSubVer is whatever byte array we read from the wire. However, this field is intended
@ -696,6 +695,9 @@ private:
const int nMyStartingHeight; const int nMyStartingHeight;
int nSendVersion; int nSendVersion;
std::list<CNetMessage> vRecvMsg; // Used only by SocketHandler thread std::list<CNetMessage> vRecvMsg; // Used only by SocketHandler thread
mutable CCriticalSection cs_addrName;
std::string addrName;
public: public:
NodeId GetId() const { NodeId GetId() const {
@ -798,6 +800,10 @@ public:
{ {
return nLocalServices; return nLocalServices;
} }
std::string GetAddrName() const;
//! Sets the addrName only if it was not previously set
void MaybeSetAddrName(const std::string& addrNameIn);
}; };

View file

@ -264,7 +264,7 @@ void PushNodeVersion(CNode *pnode, CConnman& connman, int64_t nTime)
void InitializeNode(CNode *pnode, CConnman& connman) { void InitializeNode(CNode *pnode, CConnman& connman) {
CAddress addr = pnode->addr; CAddress addr = pnode->addr;
std::string addrName = pnode->addrName; std::string addrName = pnode->GetAddrName();
NodeId nodeid = pnode->GetId(); NodeId nodeid = pnode->GetId();
{ {
LOCK(cs_main); LOCK(cs_main);