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:
Kaz Wesley
2016-04-26 17:21:22 -07:00
committed by lateminer
parent 099dbe4bb9
commit 1ed6d18a3c

View File

@@ -43,6 +43,7 @@
#include "key.h"
#include "wallet/wallet.h"
#include <atomic>
#include <sstream>
#include <boost/algorithm/string/replace.hpp>
@@ -1784,20 +1785,26 @@ CAmount GetProofOfStakeSubsidy()
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 (chainActive.Tip() == NULL)
return true;
if (chainActive.Tip()->nChainWork < UintToArith256(chainParams.GetConsensus().nMinimumChainWork))
return true;
static bool lockIBDState = false;
if (lockIBDState)
return false;
bool state = (chainActive.Height() < pindexBestHeader->nHeight - 24 * 6 ||
pindexBestHeader->GetBlockTime() < GetTime() - nMaxTipAge);
if (!state)
lockIBDState = true;
latchToFalse.store(true, std::memory_order_relaxed);
return state;
}