Skip to content

Commit 386ec19

Browse files
committed
Reduce cs_main lock accumulation during GUI startup
1 parent d42cb79 commit 386ec19

File tree

5 files changed

+17
-15
lines changed

5 files changed

+17
-15
lines changed

src/qt/bitcoin.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ static void RegisterMetaTypes()
8181

8282
qRegisterMetaType<std::function<void()>>("std::function<void()>");
8383
qRegisterMetaType<QMessageBox::Icon>("QMessageBox::Icon");
84+
qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>("interfaces::BlockAndHeaderTipInfo");
8485
}
8586

8687
static QString GetLangTerritory()
@@ -164,8 +165,9 @@ void BitcoinCore::initialize()
164165
{
165166
qDebug() << __func__ << ": Running initialization in thread";
166167
util::ThreadRename("qt-init");
167-
bool rv = m_node.appInitMain();
168-
Q_EMIT initializeResult(rv);
168+
interfaces::BlockAndHeaderTipInfo tip_info;
169+
bool rv = m_node.appInitMain(&tip_info);
170+
Q_EMIT initializeResult(rv, tip_info);
169171
} catch (const std::exception& e) {
170172
handleRunawayException(&e);
171173
} catch (...) {
@@ -342,7 +344,7 @@ void BitcoinApplication::requestShutdown()
342344
Q_EMIT requestedShutdown();
343345
}
344346

345-
void BitcoinApplication::initializeResult(bool success)
347+
void BitcoinApplication::initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info)
346348
{
347349
qDebug() << __func__ << ": Initialization result: " << success;
348350
// Set exit result.
@@ -352,7 +354,7 @@ void BitcoinApplication::initializeResult(bool success)
352354
// Log this only after AppInitMain finishes, as then logging setup is guaranteed complete
353355
qInfo() << "Platform customization:" << platformStyle->getName();
354356
clientModel = new ClientModel(m_node, optionsModel);
355-
window->setClientModel(clientModel);
357+
window->setClientModel(clientModel, &tip_info);
356358
#ifdef ENABLE_WALLET
357359
if (WalletModel::isWalletEnabled()) {
358360
m_wallet_controller = new WalletController(*clientModel, platformStyle, this);

src/qt/bitcoin.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include <QApplication>
1313
#include <memory>
1414

15+
#include <interfaces/node.h>
16+
1517
class BitcoinGUI;
1618
class ClientModel;
1719
class NetworkStyle;
@@ -21,10 +23,6 @@ class PlatformStyle;
2123
class WalletController;
2224
class WalletModel;
2325

24-
namespace interfaces {
25-
class Handler;
26-
class Node;
27-
} // namespace interfaces
2826

2927
/** Class encapsulating Bitcoin Core startup and shutdown.
3028
* Allows running startup and shutdown in a different thread from the UI thread.
@@ -40,7 +38,7 @@ public Q_SLOTS:
4038
void shutdown();
4139

4240
Q_SIGNALS:
43-
void initializeResult(bool success);
41+
void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info);
4442
void shutdownResult();
4543
void runawayException(const QString &message);
4644

@@ -91,7 +89,7 @@ class BitcoinApplication: public QApplication
9189
void setupPlatformStyle();
9290

9391
public Q_SLOTS:
94-
void initializeResult(bool success);
92+
void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info);
9593
void shutdownResult();
9694
/// Handle runaway exceptions. Shows a message box with the problem and quits the program.
9795
void handleRunawayException(const QString &message);

src/qt/bitcoingui.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ void BitcoinGUI::createToolBars()
574574
}
575575
}
576576

577-
void BitcoinGUI::setClientModel(ClientModel *_clientModel)
577+
void BitcoinGUI::setClientModel(ClientModel *_clientModel, interfaces::BlockAndHeaderTipInfo* tip_info)
578578
{
579579
this->clientModel = _clientModel;
580580
if(_clientModel)
@@ -588,8 +588,8 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel)
588588
connect(_clientModel, &ClientModel::numConnectionsChanged, this, &BitcoinGUI::setNumConnections);
589589
connect(_clientModel, &ClientModel::networkActiveChanged, this, &BitcoinGUI::setNetworkActive);
590590

591-
modalOverlay->setKnownBestHeight(_clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(_clientModel->getHeaderTipTime()));
592-
setNumBlocks(m_node.getNumBlocks(), QDateTime::fromTime_t(m_node.getLastBlockTime()), m_node.getVerificationProgress(), false, SynchronizationState::INIT_DOWNLOAD);
591+
modalOverlay->setKnownBestHeight(tip_info->header_height, QDateTime::fromTime_t(tip_info->header_time));
592+
setNumBlocks(tip_info->block_height, QDateTime::fromTime_t(tip_info->block_time), tip_info->verification_progress, false, SynchronizationState::INIT_DOWNLOAD);
593593
connect(_clientModel, &ClientModel::numBlocksChanged, this, &BitcoinGUI::setNumBlocks);
594594

595595
// Receive and report messages from client model
@@ -600,7 +600,7 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel)
600600
// Show progress dialog
601601
connect(_clientModel, &ClientModel::showProgress, this, &BitcoinGUI::showProgress);
602602

603-
rpcConsole->setClientModel(_clientModel);
603+
rpcConsole->setClientModel(_clientModel, tip_info->block_height, tip_info->block_time, tip_info->verification_progress);
604604

605605
updateProxyIcon();
606606

src/qt/bitcoingui.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ enum class SynchronizationState;
4343
namespace interfaces {
4444
class Handler;
4545
class Node;
46+
struct BlockAndHeaderTipInfo;
4647
}
4748

4849
QT_BEGIN_NAMESPACE
@@ -75,7 +76,7 @@ class BitcoinGUI : public QMainWindow
7576
/** Set the client model.
7677
The client model represents the part of the core that communicates with the P2P network, and is wallet-agnostic.
7778
*/
78-
void setClientModel(ClientModel *clientModel);
79+
void setClientModel(ClientModel *clientModel = nullptr, interfaces::BlockAndHeaderTipInfo* tip_info = nullptr);
7980
#ifdef ENABLE_WALLET
8081
void setWalletController(WalletController* wallet_controller);
8182
#endif

src/qt/test/apptests.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ void AppTests::appTests()
6767
return GetDataDir() / "blocks";
6868
}());
6969

70+
qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>("interfaces::BlockAndHeaderTipInfo");
7071
m_app.parameterSetup();
7172
m_app.createOptionsModel(true /* reset settings */);
7273
QScopedPointer<const NetworkStyle> style(NetworkStyle::instantiate(Params().NetworkIDString()));

0 commit comments

Comments
 (0)