aboutsummaryrefslogtreecommitdiff
path: root/src/validation.h
diff options
context:
space:
mode:
authorCarl Dong <contact@carldong.me>2021-01-27 16:20:59 -0500
committerCarl Dong <contact@carldong.me>2021-01-28 14:14:22 -0500
commitf92dc6557a153b390a1ae1d0808ff7ed5d02c66e (patch)
treed8f634761b2bd2a792847625776aa24fc12fd136 /src/validation.h
parente130ff38c91ad3527924e6195325f6ae7ce5d77c (diff)
validation: Guard the active_chainstate with cs_main
This avoids a potential race-condition where a thread is reading the ChainstateManager::m_active_chainstate pointer while another one is writing to it. There is no portable guarantee that reading/writing the pointer is thread-safe. This is also done in way that mimics ::ChainstateActive(), so the transition from that function to this method is easy. More discussion: 1. https://github.com/bitcoin/bitcoin/pull/20749#discussion_r559544027 2. https://github.com/bitcoin/bitcoin/pull/19806#discussion_r561023961 3. https://github.com/bitcoin/bitcoin/pull/19806#issuecomment-768946522 4. https://github.com/bitcoin/bitcoin/pull/19806#issuecomment-768955695
Diffstat (limited to 'src/validation.h')
-rw-r--r--src/validation.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/validation.h b/src/validation.h
index d3fbabe1a2..5d060ec753 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -817,7 +817,7 @@ private:
//! This is especially important when, e.g., calling ActivateBestChain()
//! on all chainstates because we are not able to hold ::cs_main going into
//! that call.
- CChainState* m_active_chainstate{nullptr};
+ CChainState* m_active_chainstate GUARDED_BY(::cs_main) {nullptr};
//! If true, the assumed-valid chainstate has been fully validated
//! by the background validation chainstate.