Fix AddrMan locking

This commit is contained in:
Matt Corallo 2016-11-25 18:11:25 -08:00
parent 047ea1052d
commit dbfaade72a
1 changed files with 10 additions and 13 deletions

View File

@ -482,6 +482,7 @@ public:
//! Return the number of (unique) addresses in all tables. //! Return the number of (unique) addresses in all tables.
size_t size() const size_t size() const
{ {
LOCK(cs); // TODO: Cache this in an atomic to avoid this overhead
return vRandom.size(); return vRandom.size();
} }
@ -501,13 +502,11 @@ public:
//! Add a single address. //! Add a single address.
bool Add(const CAddress &addr, const CNetAddr& source, int64_t nTimePenalty = 0) bool Add(const CAddress &addr, const CNetAddr& source, int64_t nTimePenalty = 0)
{ {
LOCK(cs);
bool fRet = false; bool fRet = false;
{ Check();
LOCK(cs); fRet |= Add_(addr, source, nTimePenalty);
Check(); Check();
fRet |= Add_(addr, source, nTimePenalty);
Check();
}
if (fRet) if (fRet)
LogPrint("addrman", "Added %s from %s: %i tried, %i new\n", addr.ToStringIPPort(), source.ToString(), nTried, nNew); LogPrint("addrman", "Added %s from %s: %i tried, %i new\n", addr.ToStringIPPort(), source.ToString(), nTried, nNew);
return fRet; return fRet;
@ -516,14 +515,12 @@ public:
//! Add multiple addresses. //! Add multiple addresses.
bool Add(const std::vector<CAddress> &vAddr, const CNetAddr& source, int64_t nTimePenalty = 0) bool Add(const std::vector<CAddress> &vAddr, const CNetAddr& source, int64_t nTimePenalty = 0)
{ {
LOCK(cs);
int nAdd = 0; int nAdd = 0;
{ Check();
LOCK(cs); for (std::vector<CAddress>::const_iterator it = vAddr.begin(); it != vAddr.end(); it++)
Check(); nAdd += Add_(*it, source, nTimePenalty) ? 1 : 0;
for (std::vector<CAddress>::const_iterator it = vAddr.begin(); it != vAddr.end(); it++) Check();
nAdd += Add_(*it, source, nTimePenalty) ? 1 : 0;
Check();
}
if (nAdd) if (nAdd)
LogPrint("addrman", "Added %i addresses from %s: %i tried, %i new\n", nAdd, source.ToString(), nTried, nNew); LogPrint("addrman", "Added %i addresses from %s: %i tried, %i new\n", nAdd, source.ToString(), nTried, nNew);
return nAdd > 0; return nAdd > 0;