diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1637,8 +1637,7 @@ static void BIP9SoftForkDescPushBack(const CBlockIndex *active_chain_tip, UniValue &softforks, const Consensus::Params &consensusParams, - Consensus::DeploymentPos id) - EXCLUSIVE_LOCKS_REQUIRED(cs_main) { + Consensus::DeploymentPos id) { // For BIP9 deployments. // Deployments (e.g. testdummy) with timeout value before Jan 1, 2009 are // hidden. A timeout value of 0 guarantees a softfork will never be diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1409,11 +1409,10 @@ scriptcheckqueue.StopWorkerThreads(); } -VersionBitsCache versionbitscache GUARDED_BY(cs_main); +VersionBitsCache versionbitscache; int32_t ComputeBlockVersion(const CBlockIndex *pindexPrev, const Consensus::Params ¶ms) { - LOCK(cs_main); int32_t nVersion = VERSIONBITS_TOP_BITS; for (int i = 0; i < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; i++) { diff --git a/src/versionbits.h b/src/versionbits.h --- a/src/versionbits.h +++ b/src/versionbits.h @@ -6,6 +6,8 @@ #define BITCOIN_VERSIONBITS_H #include +#include + #include /** What block version to use for new blocks (pre versionbits) */ @@ -108,7 +110,9 @@ * signal support. */ struct VersionBitsCache { - ThresholdConditionCache caches[Consensus::MAX_VERSION_BITS_DEPLOYMENTS]; + Mutex mutex; + ThresholdConditionCache + caches[Consensus::MAX_VERSION_BITS_DEPLOYMENTS] GUARDED_BY(mutex); void Clear(); }; diff --git a/src/versionbits.cpp b/src/versionbits.cpp --- a/src/versionbits.cpp +++ b/src/versionbits.cpp @@ -220,6 +220,7 @@ const Consensus::Params ¶ms, Consensus::DeploymentPos pos, VersionBitsCache &cache) { + LOCK(cache.mutex); return VersionBitsConditionChecker(pos).GetStateFor(pindexPrev, params, cache.caches[pos]); } @@ -235,6 +236,7 @@ const Consensus::Params ¶ms, Consensus::DeploymentPos pos, VersionBitsCache &cache) { + LOCK(cache.mutex); return VersionBitsConditionChecker(pos).GetStateSinceHeightFor( pindexPrev, params, cache.caches[pos]); } @@ -245,6 +247,7 @@ } void VersionBitsCache::Clear() { + LOCK(mutex); for (unsigned int d = 0; d < Consensus::MAX_VERSION_BITS_DEPLOYMENTS; d++) { caches[d].clear(); }