merge bitcoin#24103: Replace RecursiveMutex m_cs_chainstate with Mutex, and rename it

This commit is contained in:
Kittywhiskers Van Gogh 2024-07-04 14:26:26 +00:00
parent d19ffd613a
commit edc665c80d
No known key found for this signature in database
GPG Key ID: 30CD0C065E5C4AAD
2 changed files with 16 additions and 10 deletions

View File

@ -2934,6 +2934,8 @@ static void LimitValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main) {
bool CChainState::ActivateBestChain(BlockValidationState& state, std::shared_ptr<const CBlock> pblock) bool CChainState::ActivateBestChain(BlockValidationState& state, std::shared_ptr<const CBlock> pblock)
{ {
AssertLockNotHeld(m_chainstate_mutex);
// Note that while we're often called here from ProcessNewBlock, this is // Note that while we're often called here from ProcessNewBlock, this is
// far from a guarantee. Things in the P2P/RPC will often end up calling // far from a guarantee. Things in the P2P/RPC will often end up calling
// us in the middle of ProcessNewBlock - do not assume pblock is set // us in the middle of ProcessNewBlock - do not assume pblock is set
@ -2943,8 +2945,8 @@ bool CChainState::ActivateBestChain(BlockValidationState& state, std::shared_ptr
// ABC maintains a fair degree of expensive-to-calculate internal state // ABC maintains a fair degree of expensive-to-calculate internal state
// because this function periodically releases cs_main so that it does not lock up other threads for too long // because this function periodically releases cs_main so that it does not lock up other threads for too long
// during large connects - and to allow for e.g. the callback queue to drain // during large connects - and to allow for e.g. the callback queue to drain
// we use m_cs_chainstate to enforce mutual exclusion so that only one caller may execute this function at a time // we use m_chainstate_mutex to enforce mutual exclusion so that only one caller may execute this function at a time
LOCK(m_cs_chainstate); LOCK(m_chainstate_mutex);
auto start = Now<SteadyMilliseconds>(); auto start = Now<SteadyMilliseconds>();
@ -3070,6 +3072,8 @@ bool CChainState::PreciousBlock(BlockValidationState& state, CBlockIndex* pindex
bool CChainState::InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex) bool CChainState::InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex)
{ {
AssertLockNotHeld(m_chainstate_mutex);
// Genesis block can't be invalidated // Genesis block can't be invalidated
assert(pindex); assert(pindex);
if (pindex->nHeight == 0) return false; if (pindex->nHeight == 0) return false;
@ -3081,7 +3085,7 @@ bool CChainState::InvalidateBlock(BlockValidationState& state, CBlockIndex* pind
// We do not allow ActivateBestChain() to run while InvalidateBlock() is // We do not allow ActivateBestChain() to run while InvalidateBlock() is
// running, as that could cause the tip to change while we disconnect // running, as that could cause the tip to change while we disconnect
// blocks. // blocks.
LOCK(m_cs_chainstate); LOCK(m_chainstate_mutex);
// We'll be acquiring and releasing cs_main below, to allow the validation // We'll be acquiring and releasing cs_main below, to allow the validation
// callbacks to run. However, we should keep the block index in a // callbacks to run. However, we should keep the block index in a
@ -3223,9 +3227,10 @@ bool CChainState::InvalidateBlock(BlockValidationState& state, CBlockIndex* pind
void CChainState::EnforceBlock(BlockValidationState& state, const CBlockIndex *pindex) void CChainState::EnforceBlock(BlockValidationState& state, const CBlockIndex *pindex)
{ {
AssertLockNotHeld(m_chainstate_mutex);
AssertLockNotHeld(::cs_main); AssertLockNotHeld(::cs_main);
LOCK2(m_cs_chainstate, ::cs_main); LOCK2(m_chainstate_mutex, ::cs_main);
const CBlockIndex* pindex_walk = pindex; const CBlockIndex* pindex_walk = pindex;

View File

@ -468,10 +468,11 @@ protected:
arith_uint256 nLastPreciousChainwork = 0; arith_uint256 nLastPreciousChainwork = 0;
/** /**
* the ChainState CriticalSection * The ChainState Mutex
* A lock that must be held when modifying this ChainState - held in ActivateBestChain() * A lock that must be held when modifying this ChainState - held in ActivateBestChain() and
* InvalidateBlock()
*/ */
RecursiveMutex m_cs_chainstate; Mutex m_chainstate_mutex;
/** /**
* Whether this chainstate is undergoing initial block download. * Whether this chainstate is undergoing initial block download.
@ -643,7 +644,7 @@ public:
*/ */
bool ActivateBestChain( bool ActivateBestChain(
BlockValidationState& state, BlockValidationState& state,
std::shared_ptr<const CBlock> pblock = nullptr) LOCKS_EXCLUDED(cs_main); std::shared_ptr<const CBlock> pblock = nullptr) LOCKS_EXCLUDED(m_chainstate_mutex, 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); 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);
@ -661,9 +662,9 @@ public:
*/ */
bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(cs_main); bool PreciousBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(cs_main);
/** Mark a block as invalid. */ /** Mark a block as invalid. */
bool InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(cs_main); bool InvalidateBlock(BlockValidationState& state, CBlockIndex* pindex) LOCKS_EXCLUDED(m_chainstate_mutex, cs_main);
/** Enforce a block marking all the other chains as conflicting. */ /** Enforce a block marking all the other chains as conflicting. */
void EnforceBlock(BlockValidationState& state, const CBlockIndex* pindex) LOCKS_EXCLUDED(cs_main); void EnforceBlock(BlockValidationState& state, const CBlockIndex* pindex) LOCKS_EXCLUDED(m_chainstate_mutex, cs_main);
/** Remove invalidity status from a block and its descendants. */ /** Remove invalidity status from a block and its descendants. */
void ResetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main); void ResetBlockFailureFlags(CBlockIndex* pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main);