diff options
author | Kaz Wesley <keziahw@gmail.com> | 2016-04-26 17:21:22 -0700 |
---|---|---|
committer | Kaz Wesley <keziahw@gmail.com> | 2016-06-04 22:18:59 -0700 |
commit | f0fdda0181e1b05b66541bf235c6702c41664170 (patch) | |
tree | e6f288bd9315bae11b257886d7eae8ac832065c3 | |
parent | 3b9a0bf41f2336b09e854522ab1ce6dcfc7a3050 (diff) |
IsInitialBlockDownload: usually avoid locking
Optimistically test the latch bool before taking the lock.
For all IsInitialBlockDownload calls after the first to return false,
this avoids the need to lock cs_main.
-rw-r--r-- | src/main.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/main.cpp b/src/main.cpp index d2b7c6bc4f..aed8a7c421 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,6 +37,7 @@ #include "validationinterface.h" #include "versionbits.h" +#include <atomic> #include <sstream> #include <boost/algorithm/string/replace.hpp> @@ -1574,18 +1575,24 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) bool IsInitialBlockDownload() { const CChainParams& chainParams = Params(); + + // Once this function has returned false, it must remain false. + static std::atomic<bool> latchToFalse{false}; + // Optimization: pre-test latch before taking the lock. + if (latchToFalse.load(std::memory_order_relaxed)) + return false; + LOCK(cs_main); + if (latchToFalse.load(std::memory_order_relaxed)) + return false; if (fImporting || fReindex) return true; if (fCheckpointsEnabled && chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints())) return true; - static bool lockIBDState = false; - if (lockIBDState) - return false; bool state = (chainActive.Height() < pindexBestHeader->nHeight - 24 * 6 || std::max(chainActive.Tip()->GetBlockTime(), pindexBestHeader->GetBlockTime()) < GetTime() - nMaxTipAge); if (!state) - lockIBDState = true; + latchToFalse.store(true, std::memory_order_relaxed); return state; } |