Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
8a1a11b
Add missing locks to init.cpp (in AppInitMain + ThreadImport) and val…
practicalswift Nov 10, 2017
aeafe94
Add LOCK(cs). The variables 'mapTx' and 'mapNextTx' are guarded by th…
practicalswift Sep 1, 2017
37fad6a
Add LOCK(cs_main). The variable 'mapNodeState' (accessed via ProcessB…
practicalswift Sep 1, 2017
2e7344a
Add LOCK(node->cs_filter). The variable 'fRelayTxes' is guarded by th…
practicalswift Sep 1, 2017
1543ad0
Add LOCK(walletInstance->cs_wallet). The variable 'mapWallet' is guar…
practicalswift Sep 1, 2017
5f8ab50
Add GUARDED_BY(cs) [CAddrMan] annotation
practicalswift Sep 1, 2017
aedabc6
Add GUARDED_BY(cs) [CTxMemPool] annotation
practicalswift Sep 1, 2017
0fec14b
Add GUARDED_BY(cs_addrLocal) annotation
practicalswift Sep 1, 2017
3c7f4c1
Add GUARDED_BY(cs_addrName) annotation
practicalswift Sep 1, 2017
e0a8d2a
Add GUARDED_BY(cs_args) annotation
practicalswift Sep 1, 2017
41534f7
Add GUARDED_BY(cs_db) annotation
practicalswift Sep 1, 2017
4a7ae55
Add GUARDED_BY(cs_feeEstimator) annotation
practicalswift Sep 1, 2017
94c7702
Add GUARDED_BY(cs_feeFilter) annotation
practicalswift Sep 1, 2017
faffd21
Add GUARDED_BY(cs_filter) annotation
practicalswift Sep 1, 2017
4724e2b
Add GUARDED_BY(cs_hSocket) annotation
practicalswift Sep 1, 2017
0cd42f0
Add GUARDED_BY(cs_inventory) annotation
practicalswift Sep 1, 2017
8d30aa3
Add GUARDED_BY(cs_KeyStore) annotation
practicalswift Sep 1, 2017
742c489
Add GUARDED_BY(cs_main) annotation
practicalswift Sep 1, 2017
7649019
Add GUARDED_BY(cs_mapLocalHost) annotation
practicalswift Sep 1, 2017
51e756f
Add GUARDED_BY(cs_most_recent_block) annotation
practicalswift Sep 1, 2017
1ed45d1
Add GUARDED_BY(cs_proxyInfos) annotation
practicalswift Sep 1, 2017
8d7f2ad
Add GUARDED_BY(cs_sendProcessing) annotation
practicalswift Sep 1, 2017
ae80009
Add GUARDED_BY(cs_vSend) annotation
practicalswift Sep 1, 2017
38dd5f0
Add GUARDED_BY(cs_setBanned) annotation
practicalswift Sep 1, 2017
96fcd0f
Add GUARDED_BY(cs_SubVer) annotation
practicalswift Sep 1, 2017
fca5c87
Add GUARDED_BY(cs_vAddedNodes) annotation
practicalswift Sep 1, 2017
778635e
Add GUARDED_BY(cs_vNodes) annotation
practicalswift Sep 1, 2017
d294f95
Add GUARDED_BY(cs_vOneShots) annotation
practicalswift Sep 3, 2017
8821c19
Add GUARDED_BY(cs_vProcessMsg) annotation
practicalswift Sep 1, 2017
738f9b3
Add GUARDED_BY(cs_vRecv) annotation
practicalswift Sep 1, 2017
2632c85
Add GUARDED_BY(cs_wallet) annotation
practicalswift Sep 1, 2017
e05f0d4
Add GUARDED_BY(cs_warnings) annotation
practicalswift Sep 1, 2017
e30b8b6
Add GUARDED_BY(csPathCached) annotation
practicalswift Sep 1, 2017
e9bb3dd
Add GUARDED_BY(m_cs_callbacks_pending) annotation
practicalswift Sep 1, 2017
66411ed
Add EXCLUSIVE_LOCKS_REQUIRED(...) annotations
practicalswift Sep 1, 2017
1a3dbf3
Add EXCLUSIVE_LOCKS_REQUIRED(cs_LastBlockFile). cs_LastBlockFile is g…
practicalswift Sep 4, 2017
9c9d4d6
Add EXCLUSIVE_LOCKS_REQUIRED(cs_wallet). cs_wallet is guarding nWalle…
practicalswift Sep 4, 2017
855c071
Rename CAddrMan.cs to CAddrMan.cs_addrMan. Rename CTxMemPool.cs to CT…
practicalswift Sep 4, 2017
00f5c21
Add EXCLUSIVE_LOCKS_REQUIRED(cs_wallet). cs_wallet is guarding nOrder…
practicalswift Sep 4, 2017
468ad01
Add EXCLUSIVE_LOCKS_REQUIRED(cs_wallet). cs_wallet is guarding mapKey…
practicalswift Sep 4, 2017
cb8a8d1
Add EXCLUSIVE_LOCKS_REQUIRED(cs_txMemPool). cs_txMemPool is guarding …
practicalswift Sep 4, 2017
a2d7d56
Add EXCLUSIVE_LOCKS_REQUIRED(cs_wallet). cs_wallet is guarding mapTxS…
practicalswift Sep 4, 2017
1aa043c
Add EXCLUSIVE_LOCKS_REQUIRED(mempool.cs_txMemPool). mempool.cs_txMemP…
practicalswift Sep 11, 2017
f3a9665
Rename locks to get consistent and unique names
practicalswift Sep 12, 2017
45c436b
Add comment about fRPCInWarmup/rpcWarmupStatus being GUARDED_BY(cs_rp…
practicalswift Sep 14, 2017
64f012b
Add GUARDED_BY(cs_nTimeOffset) annotation.
practicalswift Sep 14, 2017
3a5cf6c
Add GUARDED_BY(cs_LastBlockFile) annotation. Add EXCLUSIVE_LOCKS_REQU…
practicalswift Sep 14, 2017
01ab138
Add GUARDED_BY(cs_nBlockSequenceId) annotation. Add EXCLUSIVE_LOCKS_R…
practicalswift Sep 14, 2017
5b39f27
Add GUARDED_BY(cs_rpcWarmup) annotation.
practicalswift Sep 14, 2017
fe7be0b
Add GUARDED_BY(cs_wallet) annotation for nWalletVersion/nWalletMaxVer…
practicalswift Sep 14, 2017
0e1f2cb
Add GUARDED_BY(cs_main) annotation
practicalswift Sep 14, 2017
2e421e2
Add PT_GUARDED_BY(cs_main) annotation
practicalswift Sep 14, 2017
b852213
Add PT_GUARDED_BY(cs_main). Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs…
practicalswift Sep 14, 2017
0845e5d
Add PT_GUARDED_BY(cs_main). Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs…
practicalswift Sep 14, 2017
e1d589b
Add LOCK(cs_main) where accessing chainActive
practicalswift Sep 14, 2017
9f95edb
Add PT_GUARDED_BY(cs_main). Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs…
practicalswift Sep 14, 2017
3a622a2
Add GUARDED_BY(cs_main). Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs_ma…
practicalswift Sep 14, 2017
cbb6033
CWallet::CreateWalletFromFile(...): Change from NO_THREAD_SAFETY_ANAL…
practicalswift Sep 15, 2017
f2b4aa9
Document all NO_THREAD_SAFETY_ANALYSIS annotations
practicalswift Sep 15, 2017
2997281
Add LOCK(cs_main) when accessing mapBlockIndex
practicalswift Sep 16, 2017
147f449
Add GUARDED_BY(cs_main). Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs_ma…
practicalswift Sep 16, 2017
c145fe8
Remove AssertLockHeld(cs_wallet) from CWallet::RescanFromTime(...)
practicalswift Sep 16, 2017
be28bf1
Add LOCK(cs_addrMan) when accessing vRandom
practicalswift Sep 16, 2017
08dc5d6
Use GUARDED_BY(...) instead of PT_GUARDED_BY(...) for guarded std::sh…
practicalswift Sep 16, 2017
a1c2089
Add LOCK(pwallet->cs_wallet) when accessing mapWallet (via CWallet::I…
practicalswift Sep 16, 2017
aedf8de
Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs_main is guarding versionbit…
practicalswift Sep 16, 2017
32ba72a
Operate directly on pool->vTxHashes to resolve Clang thread-safety an…
practicalswift Sep 16, 2017
0c470a1
[tentative/experimental change, needs review before merge] Lock env->…
practicalswift Sep 16, 2017
3d61525
Make sure the cs_main lock covers all chainActive accesses while limi…
practicalswift Sep 16, 2017
33f2089
Add GUARDED_BY(cs_main). Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs_ma…
practicalswift Sep 16, 2017
ed86da2
Add GUARDED_BY(cs_filter). Add EXCLUSIVE_LOCKS_REQUIRED(cs_filter). c…
practicalswift Sep 16, 2017
cc900ec
Add GUARDED_BY(cs_main). cs_main is guarding versionbitscache.
practicalswift Sep 16, 2017
56a201b
Add GUARDED_BY(cs_main). cs_main is guarding mapOrphanTransactions.
practicalswift Sep 16, 2017
288630a
Add GUARDED_BY(cs_warnings). cs_warnings is guarding fLargeWorkForkFo…
practicalswift Sep 17, 2017
1951963
Add LOCK(cs_KeyStore) when accessing mapKeys/mapWatchKeys/mapScripts/…
practicalswift Sep 17, 2017
00d046f
Add GUARDED_BY(cs_KeyStore). cs_KeyStore is guarding mapKeys/mapWatch…
practicalswift Sep 17, 2017
1752e15
Add NO_THREAD_SAFETY_ANALYSIS annotation for Init(const Options& conn…
practicalswift Sep 17, 2017
01097f7
Add GUARDED_BY(cs_mapLocalHost). cs_mapLocalHost is guarding mapLocal…
practicalswift Sep 17, 2017
4b003e8
Add PT_GUARDED_BY(cs_main). cs_main is guarding *pindexBestHeader.
practicalswift Sep 17, 2017
c42ed7d
Add GUARDED_BY(cs_wallet). Add EXCLUSIVE_LOCKS_REQUIRED(cs_wallet). c…
practicalswift Sep 17, 2017
b7dceee
Add GUARDED_BY(cs_callbacks_pending). cs_callbacks_pending is guardin…
practicalswift Sep 18, 2017
f7560f7
Add GUARDED_BY(cs_LastBlockFile). Add EXCLUSIVE_LOCKS_REQUIRED(cs_Las…
practicalswift Sep 18, 2017
df76e32
Add GUARDED_BY(cs_KeyStore). cs_KeyStore is guarding mapCryptedKeys.
practicalswift Sep 18, 2017
c534d2b
Add SendMessages(...) lock requirement (pto->cs_sendProcessing) also …
practicalswift Sep 18, 2017
e442df0
Add EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan) - needed when building with …
practicalswift Sep 18, 2017
d699539
Revert "Add LOCK(node->cs_filter). The variable 'fRelayTxes' is guard…
practicalswift Oct 5, 2017
3d05a8f
Revert "Add GUARDED_BY(cs_filter). Add EXCLUSIVE_LOCKS_REQUIRED(cs_fi…
practicalswift Oct 5, 2017
8917d74
Revert "Add GUARDED_BY(cs_filter) annotation"
practicalswift Oct 5, 2017
54d4fac
Add EXCLUSIVE_LOCKS_REQUIRED(cs_main) to StaleBlockRequestAllowed(...)
practicalswift Oct 18, 2017
49b8c3a
Add EXCLUSIVE_LOCKS_REQUIRED(env.cs_db). env.cs_db is guarding mapDb.
practicalswift Oct 30, 2017
1f6ff48
Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs_main is guarding chainActiv…
practicalswift Oct 30, 2017
bdca80c
Remove EXCLUSIVE_LOCKS_REQUIRED(cs_filter) from PeerLogicValidation::…
practicalswift Oct 30, 2017
6622f35
Add GUARDED_BY(cs_addrMan). Add EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan).…
practicalswift Oct 31, 2017
9267aa0
Add EXCLUSIVE_LOCKS_REQUIRED(cs_main) to ReceivedBlockTransactions. R…
practicalswift Nov 2, 2017
f67c107
Remove invalid assert and corresponding lock. chainActive height can …
practicalswift Nov 2, 2017
e376f75
Add GetDepthInMainChain lock requirement to header file. Add locking …
practicalswift Nov 3, 2017
7bf10ac
Add EXCLUSIVE_LOCKS_REQUIRED(cs_main). cs_main is guarding g_last_tip…
practicalswift Nov 3, 2017
e8641cd
Repeat already held lock inside lambda to please clang -Wthread-safety
practicalswift Nov 3, 2017
ac75e0a
Mirror locking requirements to header files.
practicalswift Nov 6, 2017
a93483f
Add missing locks to tests
practicalswift Nov 6, 2017
86b3504
Remove incorrect lock requirement annotation from ProcessNewBlock
practicalswift Nov 6, 2017
89cfabf
Add missing cs_LastBlockFile lock when accessing fCheckForPruning
practicalswift Nov 6, 2017
f1996dc
Add locking to SetNull(). Remove NO_THREAD_SAFETY_ANALYSIS.
practicalswift Nov 8, 2017
f82c0f5
Perform locking inside CConnman::Start
practicalswift Nov 8, 2017
963317b
Clarify NO_THREAD_SAFETY_ANALYSIS comment
practicalswift Nov 8, 2017
e0eadcf
Add locking to Init()
practicalswift Nov 8, 2017
5b8b449
Remove NO_THREAD_SAFETY_ANALYSIS annotation from validateaddress(...)
practicalswift Nov 9, 2017
6d768ed
Remove incorrect NO_THREAD_SAFETY_ANALYSIS comment
practicalswift Nov 9, 2017
b305c66
Remove NO_THREAD_SAFETY_ANALYSIS from AppInitMain. Add locking to App…
practicalswift Nov 10, 2017
529aa91
Use correct locking in TestSequenceLocks.
practicalswift Nov 10, 2017
5b031f2
Add temporary documentation with references to PR:s adding LOCK(...):s
practicalswift Nov 14, 2017
de9907c
Avoid new lock by moving LogPrint statement
practicalswift Nov 14, 2017
6a2cacd
[wip] Document why newly introduced locks are needed
practicalswift Nov 14, 2017
8250617
Revert locking changes in getblocktemplate(...)
practicalswift Nov 15, 2017
4c01a45
Add GUARDED_BY(cs_txMemPool) to nCheckFrequency. Add corresponding LO…
practicalswift Nov 16, 2017
789a315
Fix incorrect PT_GUARDED_BY locks. Add GUARDED_BY(cs_filter) fRelayTx…
practicalswift Nov 16, 2017
5d8e345
Fix variable name typo
practicalswift Nov 16, 2017
2909d8a
Add GUARDED_BY(cs_wallet) to nRelockTime. Add corresponding LOCK(...).
practicalswift Nov 20, 2017
e7b27cd
Add GUARDED_BY(cs_LastBlockFile) to vinfoBlockFile. Add corresponding…
practicalswift Nov 20, 2017
f131976
WIP: Fix conditional locking in validateaddress(...)
practicalswift Nov 20, 2017
91f8024
Add refereces to tracking GitHub issues
practicalswift Nov 21, 2017
358aa92
Remove comment for already merged LOCK(...)
practicalswift Nov 21, 2017
192a550
Set m_last_block_processed to nullptr in SetNull(). Acquire mutex cs_…
practicalswift Nov 22, 2017
baf7c1f
Avoid locking mutexes that are already held by the same thread
practicalswift Nov 24, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions src/addrman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ double CAddrInfo::GetChance(int64_t nNow) const
return fChance;
}

CAddrInfo* CAddrMan::Find(const CNetAddr& addr, int* pnId)
CAddrInfo* CAddrMan::Find(const CNetAddr& addr, int* pnId) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
std::map<CNetAddr, int>::iterator it = mapAddr.find(addr);
if (it == mapAddr.end())
Expand All @@ -78,7 +78,7 @@ CAddrInfo* CAddrMan::Find(const CNetAddr& addr, int* pnId)
return nullptr;
}

CAddrInfo* CAddrMan::Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId)
CAddrInfo* CAddrMan::Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
int nId = nIdCount++;
mapInfo[nId] = CAddrInfo(addr, addrSource);
Expand All @@ -90,7 +90,7 @@ CAddrInfo* CAddrMan::Create(const CAddress& addr, const CNetAddr& addrSource, in
return &mapInfo[nId];
}

void CAddrMan::SwapRandom(unsigned int nRndPos1, unsigned int nRndPos2)
void CAddrMan::SwapRandom(unsigned int nRndPos1, unsigned int nRndPos2) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
if (nRndPos1 == nRndPos2)
return;
Expand All @@ -110,7 +110,7 @@ void CAddrMan::SwapRandom(unsigned int nRndPos1, unsigned int nRndPos2)
vRandom[nRndPos2] = nId1;
}

void CAddrMan::Delete(int nId)
void CAddrMan::Delete(int nId) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
assert(mapInfo.count(nId) != 0);
CAddrInfo& info = mapInfo[nId];
Expand All @@ -124,7 +124,7 @@ void CAddrMan::Delete(int nId)
nNew--;
}

void CAddrMan::ClearNew(int nUBucket, int nUBucketPos)
void CAddrMan::ClearNew(int nUBucket, int nUBucketPos) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
// if there is an entry in the specified bucket, delete it.
if (vvNew[nUBucket][nUBucketPos] != -1) {
Expand All @@ -139,7 +139,7 @@ void CAddrMan::ClearNew(int nUBucket, int nUBucketPos)
}
}

void CAddrMan::MakeTried(CAddrInfo& info, int nId)
void CAddrMan::MakeTried(CAddrInfo& info, int nId) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
// remove the entry from all new buckets
for (int bucket = 0; bucket < ADDRMAN_NEW_BUCKET_COUNT; bucket++) {
Expand Down Expand Up @@ -187,7 +187,7 @@ void CAddrMan::MakeTried(CAddrInfo& info, int nId)
info.fInTried = true;
}

void CAddrMan::Good_(const CService& addr, int64_t nTime)
void CAddrMan::Good_(const CService& addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
int nId;

Expand Down Expand Up @@ -239,7 +239,7 @@ void CAddrMan::Good_(const CService& addr, int64_t nTime)
MakeTried(info, nId);
}

bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimePenalty)
bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimePenalty) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
if (!addr.IsRoutable())
return false;
Expand Down Expand Up @@ -312,7 +312,7 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
return fNew;
}

void CAddrMan::Attempt_(const CService& addr, bool fCountFailure, int64_t nTime)
void CAddrMan::Attempt_(const CService& addr, bool fCountFailure, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
CAddrInfo* pinfo = Find(addr);

Expand All @@ -334,7 +334,7 @@ void CAddrMan::Attempt_(const CService& addr, bool fCountFailure, int64_t nTime)
}
}

CAddrInfo CAddrMan::Select_(bool newOnly)
CAddrInfo CAddrMan::Select_(bool newOnly) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
if (size() == 0)
return CAddrInfo();
Expand Down Expand Up @@ -382,7 +382,7 @@ CAddrInfo CAddrMan::Select_(bool newOnly)
}

#ifdef DEBUG_ADDRMAN
int CAddrMan::Check_()
int CAddrMan::Check_() EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
std::set<int> setTried;
std::map<int, int> mapNew;
Expand Down Expand Up @@ -459,7 +459,7 @@ int CAddrMan::Check_()
}
#endif

void CAddrMan::GetAddr_(std::vector<CAddress>& vAddr)
void CAddrMan::GetAddr_(std::vector<CAddress>& vAddr) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
unsigned int nNodes = ADDRMAN_GETADDR_MAX_PCT * vRandom.size() / 100;
if (nNodes > ADDRMAN_GETADDR_MAX)
Expand All @@ -480,7 +480,7 @@ void CAddrMan::GetAddr_(std::vector<CAddress>& vAddr)
}
}

void CAddrMan::Connected_(const CService& addr, int64_t nTime)
void CAddrMan::Connected_(const CService& addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
CAddrInfo* pinfo = Find(addr);

Expand All @@ -500,7 +500,7 @@ void CAddrMan::Connected_(const CService& addr, int64_t nTime)
info.nTime = nTime;
}

void CAddrMan::SetServices_(const CService& addr, ServiceFlags nServices)
void CAddrMan::SetServices_(const CService& addr, ServiceFlags nServices) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan)
{
CAddrInfo* pinfo = Find(addr);

Expand Down
74 changes: 37 additions & 37 deletions src/addrman.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,34 +183,34 @@ class CAddrMan
{
private:
//! critical section to protect the inner data structures
mutable CCriticalSection cs;
mutable CCriticalSection cs_addrMan;

//! last used nId
int nIdCount;
int nIdCount GUARDED_BY(cs_addrMan);

//! table with information about all nIds
std::map<int, CAddrInfo> mapInfo;
std::map<int, CAddrInfo> mapInfo GUARDED_BY(cs_addrMan);

//! find an nId based on its network address
std::map<CNetAddr, int> mapAddr;
std::map<CNetAddr, int> mapAddr GUARDED_BY(cs_addrMan);

//! randomly-ordered vector of all nIds
std::vector<int> vRandom;
std::vector<int> vRandom GUARDED_BY(cs_addrMan);

// number of "tried" entries
int nTried;
int nTried GUARDED_BY(cs_addrMan);

//! list of "tried" buckets
int vvTried[ADDRMAN_TRIED_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE];
int vvTried[ADDRMAN_TRIED_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs_addrMan);

//! number of (unique) "new" entries
int nNew;
int nNew GUARDED_BY(cs_addrMan);

//! list of "new" buckets
int vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE];
int vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] GUARDED_BY(cs_addrMan);

//! last time Good was called (memory only)
int64_t nLastGood;
int64_t nLastGood GUARDED_BY(cs_addrMan);

protected:
//! secret key to randomize bucket select with
Expand All @@ -220,52 +220,52 @@ class CAddrMan
FastRandomContext insecure_rand;

//! Find an entry.
CAddrInfo* Find(const CNetAddr& addr, int *pnId = nullptr);
CAddrInfo* Find(const CNetAddr& addr, int *pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! find an entry, creating it if necessary.
//! nTime and nServices of the found node are updated, if necessary.
CAddrInfo* Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId = nullptr);
CAddrInfo* Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Swap two elements in vRandom.
void SwapRandom(unsigned int nRandomPos1, unsigned int nRandomPos2);
void SwapRandom(unsigned int nRandomPos1, unsigned int nRandomPos2) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Move an entry from the "new" table(s) to the "tried" table
void MakeTried(CAddrInfo& info, int nId);
void MakeTried(CAddrInfo& info, int nId) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Delete an entry. It must not be in tried, and have refcount 0.
void Delete(int nId);
void Delete(int nId) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Clear a position in a "new" table. This is the only place where entries are actually deleted.
void ClearNew(int nUBucket, int nUBucketPos);
void ClearNew(int nUBucket, int nUBucketPos) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Mark an entry "good", possibly moving it from "new" to "tried".
void Good_(const CService &addr, int64_t nTime);
void Good_(const CService &addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Add an entry to the "new" table.
bool Add_(const CAddress &addr, const CNetAddr& source, int64_t nTimePenalty);
bool Add_(const CAddress &addr, const CNetAddr& source, int64_t nTimePenalty) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Mark an entry as attempted to connect.
void Attempt_(const CService &addr, bool fCountFailure, int64_t nTime);
void Attempt_(const CService &addr, bool fCountFailure, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Select an address to connect to, if newOnly is set to true, only the new table is selected from.
CAddrInfo Select_(bool newOnly);
CAddrInfo Select_(bool newOnly) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Wraps GetRandInt to allow tests to override RandomInt and make it determinismistic.
virtual int RandomInt(int nMax);

#ifdef DEBUG_ADDRMAN
//! Perform consistency check. Returns an error code or zero.
int Check_();
int Check_() EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);
#endif

//! Select several addresses at once.
void GetAddr_(std::vector<CAddress> &vAddr);
void GetAddr_(std::vector<CAddress> &vAddr) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Mark an entry as currently-connected-to.
void Connected_(const CService &addr, int64_t nTime);
void Connected_(const CService &addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

//! Update an entry's service bits.
void SetServices_(const CService &addr, ServiceFlags nServices);
void SetServices_(const CService &addr, ServiceFlags nServices) EXCLUSIVE_LOCKS_REQUIRED(cs_addrMan);

public:
/**
Expand Down Expand Up @@ -300,7 +300,7 @@ class CAddrMan
template<typename Stream>
void Serialize(Stream &s) const
{
LOCK(cs);
LOCK(cs_addrMan);

unsigned char nVersion = 1;
s << nVersion;
Expand Down Expand Up @@ -350,7 +350,7 @@ class CAddrMan
template<typename Stream>
void Unserialize(Stream& s)
{
LOCK(cs);
LOCK(cs_addrMan);

Clear();

Expand Down Expand Up @@ -455,7 +455,7 @@ class CAddrMan

void Clear()
{
LOCK(cs);
LOCK(cs_addrMan);
std::vector<int>().swap(vRandom);
nKey = GetRandHash();
for (size_t bucket = 0; bucket < ADDRMAN_NEW_BUCKET_COUNT; bucket++) {
Expand Down Expand Up @@ -490,7 +490,7 @@ class CAddrMan
//! Return the number of (unique) addresses in all tables.
size_t size() const
{
LOCK(cs); // TODO: Cache this in an atomic to avoid this overhead
LOCK(cs_addrMan); // TODO: Cache this in an atomic to avoid this overhead
return vRandom.size();
}

Expand All @@ -499,7 +499,7 @@ class CAddrMan
{
#ifdef DEBUG_ADDRMAN
{
LOCK(cs);
LOCK(cs_addrMan);
int err;
if ((err=Check_()))
LogPrintf("ADDRMAN CONSISTENCY CHECK FAILED!!! err=%i\n", err);
Expand All @@ -510,7 +510,7 @@ class CAddrMan
//! Add a single address.
bool Add(const CAddress &addr, const CNetAddr& source, int64_t nTimePenalty = 0)
{
LOCK(cs);
LOCK(cs_addrMan);
bool fRet = false;
Check();
fRet |= Add_(addr, source, nTimePenalty);
Expand All @@ -524,7 +524,7 @@ class CAddrMan
//! Add multiple addresses.
bool Add(const std::vector<CAddress> &vAddr, const CNetAddr& source, int64_t nTimePenalty = 0)
{
LOCK(cs);
LOCK(cs_addrMan);
int nAdd = 0;
Check();
for (std::vector<CAddress>::const_iterator it = vAddr.begin(); it != vAddr.end(); it++)
Expand All @@ -539,7 +539,7 @@ class CAddrMan
//! Mark an entry as accessible.
void Good(const CService &addr, int64_t nTime = GetAdjustedTime())
{
LOCK(cs);
LOCK(cs_addrMan);
Check();
Good_(addr, nTime);
Check();
Expand All @@ -548,7 +548,7 @@ class CAddrMan
//! Mark an entry as connection attempted to.
void Attempt(const CService &addr, bool fCountFailure, int64_t nTime = GetAdjustedTime())
{
LOCK(cs);
LOCK(cs_addrMan);
Check();
Attempt_(addr, fCountFailure, nTime);
Check();
Expand All @@ -561,7 +561,7 @@ class CAddrMan
{
CAddrInfo addrRet;
{
LOCK(cs);
LOCK(cs_addrMan);
Check();
addrRet = Select_(newOnly);
Check();
Expand All @@ -575,7 +575,7 @@ class CAddrMan
Check();
std::vector<CAddress> vAddr;
{
LOCK(cs);
LOCK(cs_addrMan);
GetAddr_(vAddr);
}
Check();
Expand All @@ -585,15 +585,15 @@ class CAddrMan
//! Mark an entry as currently-connected-to.
void Connected(const CService &addr, int64_t nTime = GetAdjustedTime())
{
LOCK(cs);
LOCK(cs_addrMan);
Check();
Connected_(addr, nTime);
Check();
}

void SetServices(const CService &addr, ServiceFlags nServices)
{
LOCK(cs);
LOCK(cs_addrMan);
Check();
SetServices_(addr, nServices);
Check();
Expand Down
9 changes: 4 additions & 5 deletions src/blockencodings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,14 +103,13 @@ ReadStatus PartiallyDownloadedBlock::InitData(const CBlockHeaderAndShortTxIDs& c

std::vector<bool> have_txn(txn_available.size());
{
LOCK(pool->cs);
const std::vector<std::pair<uint256, CTxMemPool::txiter> >& vTxHashes = pool->vTxHashes;
for (size_t i = 0; i < vTxHashes.size(); i++) {
uint64_t shortid = cmpctblock.GetShortID(vTxHashes[i].first);
LOCK(pool->cs_txMemPool);
for (size_t i = 0; i < pool->vTxHashes.size(); i++) {
uint64_t shortid = cmpctblock.GetShortID(pool->vTxHashes[i].first);
std::unordered_map<uint64_t, uint16_t>::iterator idit = shorttxids.find(shortid);
if (idit != shorttxids.end()) {
if (!have_txn[idit->second]) {
txn_available[idit->second] = vTxHashes[i].second->GetSharedTx();
txn_available[idit->second] = pool->vTxHashes[i].second->GetSharedTx();
have_txn[idit->second] = true;
mempool_count++;
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/checkpoints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

namespace Checkpoints {

CBlockIndex* GetLastCheckpoint(const CCheckpointData& data)
CBlockIndex* GetLastCheckpoint(const CCheckpointData& data) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
{
const MapCheckpoints& checkpoints = data.mapCheckpoints;

Expand Down
Loading