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.
This commit is contained in:
parent
3b9a0bf41f
commit
f0fdda0181
1 changed files with 11 additions and 4 deletions
15
src/main.cpp
15
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue