aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcoFalke <falke.marco@gmail.com>2022-02-08 15:53:45 +0100
committerMarcoFalke <falke.marco@gmail.com>2022-02-08 15:53:49 +0100
commit280a7777d3a368101d667a80ebc536e95abb2f8c (patch)
treeaa44f55c6f8bc89b1b0f42c319f3459ec7423ee4 /src
parent8edb0416dd4a13f6fae0c7f2f2061dd6f9365a0e (diff)
parent99de8068cd08ecc2ad5dfe603bf3c2cc5b8b33aa (diff)
downloadbitcoin-280a7777d3a368101d667a80ebc536e95abb2f8c.tar.xz
Merge bitcoin/bitcoin#24235: validation: use stronger EXCLUSIVE_LOCKS_REQUIRED()
99de8068cd08ecc2ad5dfe603bf3c2cc5b8b33aa validation: use stronger EXCLUSIVE_LOCKS_REQUIRED() (Vasil Dimov) Pull request description: https://github.com/bitcoin/bitcoin/pull/24103 added annotations to denote that the callers of `CChainState::ActivateBestChain()` and `CChainState::InvalidateBlock()` must not own `m_chainstate_mutex` at the time of the call. Replace the added `LOCKS_EXCLUDED()` with a stronger `EXCLUSIVE_LOCKS_REQUIRED()`, see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#negative for the difference between both. ACKs for top commit: hebasto: ACK 99de8068cd08ecc2ad5dfe603bf3c2cc5b8b33aa. jonatack: ACK 99de8068cd08ecc2ad5dfe603bf3c2cc5b8b33aa. Tested with Debian clang version 13.0.1. Reproduced hebasto's results. Verified that `LoadExternalBlockFile()` needs the annotation added here. Tree-SHA512: 59640d9ad472cdb5066ecde89cc0aff8632a351fc030f39bb43800d2c856fb1aed3576e4134212d32be161b18780f06dc5066ac71df7f7cd69e3f21f886e1542
Diffstat (limited to 'src')
-rw-r--r--src/validation.h17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/validation.h b/src/validation.h
index fb258005f1..fdfd29d1f8 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -597,7 +597,8 @@ public:
EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
/** Import blocks from an external file */
- void LoadExternalBlockFile(FILE* fileIn, FlatFilePos* dbp = nullptr);
+ void LoadExternalBlockFile(FILE* fileIn, FlatFilePos* dbp = nullptr)
+ EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex);
/**
* Update the on-disk chain state.
@@ -639,7 +640,9 @@ public:
*/
bool ActivateBestChain(
BlockValidationState& state,
- std::shared_ptr<const CBlock> pblock = nullptr) LOCKS_EXCLUDED(m_chainstate_mutex, cs_main);
+ std::shared_ptr<const CBlock> pblock = nullptr)
+ EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
+ LOCKS_EXCLUDED(::cs_main);
bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, BlockValidationState& state, CBlockIndex** ppindex, bool fRequested, const FlatFilePos* dbp, bool* fNewBlock) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
@@ -657,9 +660,15 @@ public:
*
* May not be called in a validationinterface callback.
*/
- bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(cs_main);
+ bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex)
+ EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
+ LOCKS_EXCLUDED(::cs_main);
+
/** Mark a block as invalid. */
- bool InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(m_chainstate_mutex, cs_main);
+ bool InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex)
+ EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
+ LOCKS_EXCLUDED(::cs_main);
+
/** Remove invalidity status from a block and its descendants. */
void ResetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);