mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-12-12 05:34:57 +01:00
Reduce cs_main locks during modal overlay by adding an atomic cache
This commit is contained in:
@@ -36,6 +36,8 @@ ClientModel::ClientModel(OptionsModel *_optionsModel, QObject *parent) :
|
||||
banTableModel(0),
|
||||
pollTimer(0)
|
||||
{
|
||||
cachedBestHeaderHeight = -1;
|
||||
cachedBestHeaderTime = -1;
|
||||
peerTableModel = new PeerTableModel(this);
|
||||
banTableModel = new BanTableModel(this);
|
||||
pollTimer = new QTimer(this);
|
||||
@@ -72,20 +74,28 @@ int ClientModel::getNumBlocks() const
|
||||
return chainActive.Height();
|
||||
}
|
||||
|
||||
int ClientModel::getHeaderTipHeight() const
|
||||
int ClientModel::getHeaderTipHeight()
|
||||
{
|
||||
LOCK(cs_main);
|
||||
if (!pindexBestHeader)
|
||||
return 0;
|
||||
return pindexBestHeader->nHeight;
|
||||
if (cachedBestHeaderHeight == -1) {
|
||||
// make sure we initially populate the cache via a cs_main lock
|
||||
// otherwise we need to wait for a tip update
|
||||
LOCK(cs_main);
|
||||
if (pindexBestHeader) {
|
||||
cachedBestHeaderHeight = pindexBestHeader->nHeight;
|
||||
}
|
||||
}
|
||||
return cachedBestHeaderHeight;
|
||||
}
|
||||
|
||||
int64_t ClientModel::getHeaderTipTime() const
|
||||
int64_t ClientModel::getHeaderTipTime()
|
||||
{
|
||||
LOCK(cs_main);
|
||||
if (!pindexBestHeader)
|
||||
return 0;
|
||||
return pindexBestHeader->GetBlockTime();
|
||||
if (cachedBestHeaderTime == -1) {
|
||||
LOCK(cs_main);
|
||||
if (pindexBestHeader) {
|
||||
cachedBestHeaderTime = pindexBestHeader->GetBlockTime();
|
||||
}
|
||||
}
|
||||
return cachedBestHeaderTime;
|
||||
}
|
||||
|
||||
quint64 ClientModel::getTotalBytesRecv() const
|
||||
@@ -283,6 +293,11 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CB
|
||||
|
||||
int64_t& nLastUpdateNotification = fHeader ? nLastHeaderTipUpdateNotification : nLastBlockTipUpdateNotification;
|
||||
|
||||
if (fHeader) {
|
||||
// cache best headers time and height to reduce future cs_main locks
|
||||
clientmodel->cachedBestHeaderHeight = pIndex->nHeight;
|
||||
clientmodel->cachedBestHeaderTime = pIndex->GetBlockTime();
|
||||
}
|
||||
// if we are in-sync, update the UI regardless of last update time
|
||||
if (!initialSync || now - nLastUpdateNotification > MODEL_UPDATE_DELAY) {
|
||||
//pass a async signal to the UI thread
|
||||
|
||||
Reference in New Issue
Block a user