Merge #8007: Minor locking improvements

f0fdda0 IsInitialBlockDownload: usually avoid locking (Kaz Wesley)
This commit is contained in:
Wladimir J. van der Laan 2016-06-06 15:45:25 +02:00
commit 6b781df74f
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6

View File

@ -37,6 +37,7 @@
#include "validationinterface.h" #include "validationinterface.h"
#include "versionbits.h" #include "versionbits.h"
#include <atomic>
#include <sstream> #include <sstream>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
@ -1577,18 +1578,24 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
bool IsInitialBlockDownload() bool IsInitialBlockDownload()
{ {
const CChainParams& chainParams = Params(); 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); LOCK(cs_main);
if (latchToFalse.load(std::memory_order_relaxed))
return false;
if (fImporting || fReindex) if (fImporting || fReindex)
return true; return true;
if (fCheckpointsEnabled && chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints())) if (fCheckpointsEnabled && chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints()))
return true; return true;
static bool lockIBDState = false;
if (lockIBDState)
return false;
bool state = (chainActive.Height() < pindexBestHeader->nHeight - 24 * 6 || bool state = (chainActive.Height() < pindexBestHeader->nHeight - 24 * 6 ||
std::max(chainActive.Tip()->GetBlockTime(), pindexBestHeader->GetBlockTime()) < GetTime() - nMaxTipAge); std::max(chainActive.Tip()->GetBlockTime(), pindexBestHeader->GetBlockTime()) < GetTime() - nMaxTipAge);
if (!state) if (!state)
lockIBDState = true; latchToFalse.store(true, std::memory_order_relaxed);
return state; return state;
} }