On the way of transit from RecursiveMutex
to Mutex
(see #19303) it is crucial to have run-time AssertLockHeld()
assertion that does not hide compile-time Clang Thread Safety Analysis warnings.
On master (65e4ecabd5b4252154640c7bac38c92a3f3a7018) using AssertLockHeld()
could hide Clang Thread Safety Analysis warnings, e.g., with the following patch applied:
0--- a/src/txmempool.h
1+++ b/src/txmempool.h
2@@ -607,7 +607,7 @@ public:
3 void addUnchecked(const CTxMemPoolEntry& entry, setEntries& setAncestors, bool validFeeEstimate = true) EXCLUSIVE_LOCKS_REQUIRED(cs, cs_main);
4
5 void removeRecursive(const CTransaction& tx, MemPoolRemovalReason reason) EXCLUSIVE_LOCKS_REQUIRED(cs);
6- void removeForReorg(const CCoinsViewCache* pcoins, unsigned int nMemPoolHeight, int flags) EXCLUSIVE_LOCKS_REQUIRED(cs, cs_main);
7+ void removeForReorg(const CCoinsViewCache* pcoins, unsigned int nMemPoolHeight, int flags) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
8 void removeConflicts(const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(cs);
9 void removeForBlock(const std::vector<CTransactionRef>& vtx, unsigned int nBlockHeight) EXCLUSIVE_LOCKS_REQUIRED(cs);
10
Clang compiles the code without any thread safety warnings.
See “Add missed thread safety annotations” commit for the actual thread safety warnings that are fixed in this PR.