Move CNode::addrName accesses behind locked accessors
This commit is contained in:
parent
d8f2b8a8c0
commit
036073bf87
3 changed files with 30 additions and 10 deletions
30
src/net.cpp
30
src/net.cpp
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue