Skip to content

Commit 280a777

Browse files
author
MarcoFalke
committed
Merge bitcoin/bitcoin#24235: validation: use stronger EXCLUSIVE_LOCKS_REQUIRED()
99de806 validation: use stronger EXCLUSIVE_LOCKS_REQUIRED() (Vasil Dimov) Pull request description: bitcoin/bitcoin#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 99de806. jonatack: ACK 99de806. Tested with Debian clang version 13.0.1. Reproduced hebasto's results. Verified that `LoadExternalBlockFile()` needs the annotation added here. Tree-SHA512: 59640d9ad472cdb5066ecde89cc0aff8632a351fc030f39bb43800d2c856fb1aed3576e4134212d32be161b18780f06dc5066ac71df7f7cd69e3f21f886e1542
2 parents 8edb041 + 99de806 commit 280a777

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

src/validation.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,8 @@ class CChainState
597597
EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
598598

599599
/** Import blocks from an external file */
600-
void LoadExternalBlockFile(FILE* fileIn, FlatFilePos* dbp = nullptr);
600+
void LoadExternalBlockFile(FILE* fileIn, FlatFilePos* dbp = nullptr)
601+
EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex);
601602

602603
/**
603604
* Update the on-disk chain state.
@@ -639,7 +640,9 @@ class CChainState
639640
*/
640641
bool ActivateBestChain(
641642
BlockValidationState& state,
642-
std::shared_ptr<const CBlock> pblock = nullptr) LOCKS_EXCLUDED(m_chainstate_mutex, cs_main);
643+
std::shared_ptr<const CBlock> pblock = nullptr)
644+
EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
645+
LOCKS_EXCLUDED(::cs_main);
643646

644647
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);
645648

@@ -657,9 +660,15 @@ class CChainState
657660
*
658661
* May not be called in a validationinterface callback.
659662
*/
660-
bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(cs_main);
663+
bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex)
664+
EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
665+
LOCKS_EXCLUDED(::cs_main);
666+
661667
/** Mark a block as invalid. */
662-
bool InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(m_chainstate_mutex, cs_main);
668+
bool InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex)
669+
EXCLUSIVE_LOCKS_REQUIRED(!m_chainstate_mutex)
670+
LOCKS_EXCLUDED(::cs_main);
671+
663672
/** Remove invalidity status from a block and its descendants. */
664673
void ResetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
665674

0 commit comments

Comments
 (0)