mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 20:42:59 +01:00
merge bitcoin#24103: Replace RecursiveMutex m_cs_chainstate with Mutex, and rename it
This commit is contained in:
parent
d19ffd613a
commit
edc665c80d
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user