diff options
author | Anthony Towns <aj@erisian.com.au> | 2020-12-29 22:43:18 +1000 |
---|---|---|
committer | Anthony Towns <aj@erisian.com.au> | 2021-06-29 17:11:12 +1000 |
commit | eccd736f3dc231ac0306ca763c3b72cf8247230a (patch) | |
tree | 3d9a5aaeaec55e5942a66f2523e0564d52b6f2d5 | |
parent | 36a4ba0aaaa9b35185d7178994e36bc02cca9887 (diff) |
versionbits: Use dedicated lock instead of cs_main
-rw-r--r-- | src/rpc/blockchain.cpp | 2 | ||||
-rw-r--r-- | src/validation.cpp | 8 | ||||
-rw-r--r-- | src/versionbits.cpp | 3 | ||||
-rw-r--r-- | src/versionbits.h | 5 |
4 files changed, 11 insertions, 7 deletions
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 02f8cec54c..22600c5340 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1361,7 +1361,7 @@ static void BuriedForkDescPushBack(UniValue& softforks, const std::string &name, softforks.pushKV(name, rv); } -static void BIP9SoftForkDescPushBack(const CBlockIndex* active_chain_tip, UniValue& softforks, const std::string &name, const Consensus::Params& consensusParams, Consensus::DeploymentPos id) EXCLUSIVE_LOCKS_REQUIRED(cs_main) +static void BIP9SoftForkDescPushBack(const CBlockIndex* active_chain_tip, UniValue& softforks, const std::string &name, const Consensus::Params& consensusParams, Consensus::DeploymentPos id) { // For BIP9 deployments. // Deployments that are never active are hidden. diff --git a/src/validation.cpp b/src/validation.cpp index df0ec3bd4f..1b0f881d14 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1606,11 +1606,10 @@ void StopScriptCheckWorkerThreads() scriptcheckqueue.StopWorkerThreads(); } -VersionBitsCache versionbitscache GUARDED_BY(cs_main); +VersionBitsCache versionbitscache; int32_t ComputeBlockVersion(const CBlockIndex* pindexPrev, const Consensus::Params& params) { - LOCK(cs_main); int32_t nVersion = VERSIONBITS_TOP_BITS; for (int i = 0; i < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; i++) { @@ -1659,9 +1658,8 @@ static bool IsScriptWitnessEnabled(const Consensus::Params& params) return params.SegwitHeight != std::numeric_limits<int>::max(); } -static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& consensusparams) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { - AssertLockHeld(cs_main); - +static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& consensusparams) +{ unsigned int flags = SCRIPT_VERIFY_NONE; // BIP16 didn't become active until Apr 1 2012 (on mainnet, and diff --git a/src/versionbits.cpp b/src/versionbits.cpp index df2ec4e056..07ecc93c93 100644 --- a/src/versionbits.cpp +++ b/src/versionbits.cpp @@ -192,6 +192,7 @@ public: ThresholdState VersionBitsState(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache) { + LOCK(cache.mutex); return VersionBitsConditionChecker(pos).GetStateFor(pindexPrev, params, cache.caches[pos]); } @@ -202,6 +203,7 @@ BIP9Stats VersionBitsStatistics(const CBlockIndex* pindexPrev, const Consensus:: int VersionBitsStateSinceHeight(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache) { + LOCK(cache.mutex); return VersionBitsConditionChecker(pos).GetStateSinceHeightFor(pindexPrev, params, cache.caches[pos]); } @@ -212,6 +214,7 @@ uint32_t VersionBitsMask(const Consensus::Params& params, Consensus::DeploymentP void VersionBitsCache::Clear() { + LOCK(mutex); for (unsigned int d = 0; d < Consensus::MAX_VERSION_BITS_DEPLOYMENTS; d++) { caches[d].clear(); } diff --git a/src/versionbits.h b/src/versionbits.h index dce3941288..24279a0de4 100644 --- a/src/versionbits.h +++ b/src/versionbits.h @@ -6,6 +6,8 @@ #define BITCOIN_VERSIONBITS_H #include <chain.h> +#include <sync.h> + #include <map> /** What block version to use for new blocks (pre versionbits) */ @@ -75,7 +77,8 @@ public: * keyed by the bit position used to 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(); }; |