mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 23:18:14 +01:00
Merge bitcoin/bitcoin#23005: multiprocess: Delay wallet client construction
ad085f9ba1multiprocess: Delay wallet client construction (Russell Yanofsky) Pull request description: Delay wallet client construction until after logging, thread and other init for two reasons: - More responsive multiprocess GUI startup. When bitcoin-gui is started this moves the call from bitcoin-gui to bitcoin-node that spawns bitcoin-wallet off of the GUI event thread and onto the background GUI init executor thread. - Avoids feature_logging.py test failures with bitcoin-node by making bitcoin-wallet logging start after bitcoin-node logging starts, because the tests are not written to handle the bitcoin-wallet logging init code running first. This partially reverts commitb266b3e0bf, moving wallet client creation back to the place it was located before. --- This PR is part of the [process separation project](https://github.com/bitcoin/bitcoin/projects/10). ACKs for top commit: laanwj: code review ACKad085f9ba1hebasto: ACKad085f9ba1, I have reviewed the code and it looks OK. Tree-SHA512: 74d957ce2ee096db745c517124f60800185814b06c20db676090e10dce1b90311adbab02865a69731f8c39b9365f9ee14be0830ca1368cac9b474801ea92bad5
This commit is contained in:
12
src/init.cpp
12
src/init.cpp
@@ -1102,11 +1102,6 @@ bool AppInitLockDataDirectory()
|
|||||||
bool AppInitInterfaces(NodeContext& node)
|
bool AppInitInterfaces(NodeContext& node)
|
||||||
{
|
{
|
||||||
node.chain = node.init->makeChain();
|
node.chain = node.init->makeChain();
|
||||||
// Create client interfaces for wallets that are supposed to be loaded
|
|
||||||
// according to -wallet and -disablewallet options. This only constructs
|
|
||||||
// the interfaces, it doesn't load wallet data. Wallets actually get loaded
|
|
||||||
// when load() and start() interface methods are called below.
|
|
||||||
g_wallet_init_interface.Construct(node);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1170,6 +1165,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
|
|
||||||
GetMainSignals().RegisterBackgroundSignalScheduler(*node.scheduler);
|
GetMainSignals().RegisterBackgroundSignalScheduler(*node.scheduler);
|
||||||
|
|
||||||
|
// Create client interfaces for wallets that are supposed to be loaded
|
||||||
|
// according to -wallet and -disablewallet options. This only constructs
|
||||||
|
// the interfaces, it doesn't load wallet data. Wallets actually get loaded
|
||||||
|
// when load() and start() interface methods are called below.
|
||||||
|
g_wallet_init_interface.Construct(node);
|
||||||
|
uiInterface.InitWallet();
|
||||||
|
|
||||||
/* Register RPC commands regardless of -server setting so they will be
|
/* Register RPC commands regardless of -server setting so they will be
|
||||||
* available in the GUI RPC console even if external calls are disabled.
|
* available in the GUI RPC console even if external calls are disabled.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -206,6 +206,10 @@ public:
|
|||||||
using ShowProgressFn = std::function<void(const std::string& title, int progress, bool resume_possible)>;
|
using ShowProgressFn = std::function<void(const std::string& title, int progress, bool resume_possible)>;
|
||||||
virtual std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn) = 0;
|
virtual std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn) = 0;
|
||||||
|
|
||||||
|
//! Register handler for wallet client constructed messages.
|
||||||
|
using InitWalletFn = std::function<void()>;
|
||||||
|
virtual std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn) = 0;
|
||||||
|
|
||||||
//! Register handler for number of connections changed messages.
|
//! Register handler for number of connections changed messages.
|
||||||
using NotifyNumConnectionsChangedFn = std::function<void(int new_num_connections)>;
|
using NotifyNumConnectionsChangedFn = std::function<void(int new_num_connections)>;
|
||||||
virtual std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) = 0;
|
virtual std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) = 0;
|
||||||
|
|||||||
@@ -296,6 +296,10 @@ public:
|
|||||||
{
|
{
|
||||||
return MakeHandler(::uiInterface.ShowProgress_connect(fn));
|
return MakeHandler(::uiInterface.ShowProgress_connect(fn));
|
||||||
}
|
}
|
||||||
|
std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn) override
|
||||||
|
{
|
||||||
|
return MakeHandler(::uiInterface.InitWallet_connect(fn));
|
||||||
|
}
|
||||||
std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) override
|
std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) override
|
||||||
{
|
{
|
||||||
return MakeHandler(::uiInterface.NotifyNumConnectionsChanged_connect(fn));
|
return MakeHandler(::uiInterface.NotifyNumConnectionsChanged_connect(fn));
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ struct UISignals {
|
|||||||
boost::signals2::signal<CClientUIInterface::ThreadSafeMessageBoxSig, boost::signals2::optional_last_value<bool>> ThreadSafeMessageBox;
|
boost::signals2::signal<CClientUIInterface::ThreadSafeMessageBoxSig, boost::signals2::optional_last_value<bool>> ThreadSafeMessageBox;
|
||||||
boost::signals2::signal<CClientUIInterface::ThreadSafeQuestionSig, boost::signals2::optional_last_value<bool>> ThreadSafeQuestion;
|
boost::signals2::signal<CClientUIInterface::ThreadSafeQuestionSig, boost::signals2::optional_last_value<bool>> ThreadSafeQuestion;
|
||||||
boost::signals2::signal<CClientUIInterface::InitMessageSig> InitMessage;
|
boost::signals2::signal<CClientUIInterface::InitMessageSig> InitMessage;
|
||||||
|
boost::signals2::signal<CClientUIInterface::InitWalletSig> InitWallet;
|
||||||
boost::signals2::signal<CClientUIInterface::NotifyNumConnectionsChangedSig> NotifyNumConnectionsChanged;
|
boost::signals2::signal<CClientUIInterface::NotifyNumConnectionsChangedSig> NotifyNumConnectionsChanged;
|
||||||
boost::signals2::signal<CClientUIInterface::NotifyNetworkActiveChangedSig> NotifyNetworkActiveChanged;
|
boost::signals2::signal<CClientUIInterface::NotifyNetworkActiveChangedSig> NotifyNetworkActiveChanged;
|
||||||
boost::signals2::signal<CClientUIInterface::NotifyAlertChangedSig> NotifyAlertChanged;
|
boost::signals2::signal<CClientUIInterface::NotifyAlertChangedSig> NotifyAlertChanged;
|
||||||
@@ -34,6 +35,7 @@ static UISignals g_ui_signals;
|
|||||||
ADD_SIGNALS_IMPL_WRAPPER(ThreadSafeMessageBox);
|
ADD_SIGNALS_IMPL_WRAPPER(ThreadSafeMessageBox);
|
||||||
ADD_SIGNALS_IMPL_WRAPPER(ThreadSafeQuestion);
|
ADD_SIGNALS_IMPL_WRAPPER(ThreadSafeQuestion);
|
||||||
ADD_SIGNALS_IMPL_WRAPPER(InitMessage);
|
ADD_SIGNALS_IMPL_WRAPPER(InitMessage);
|
||||||
|
ADD_SIGNALS_IMPL_WRAPPER(InitWallet);
|
||||||
ADD_SIGNALS_IMPL_WRAPPER(NotifyNumConnectionsChanged);
|
ADD_SIGNALS_IMPL_WRAPPER(NotifyNumConnectionsChanged);
|
||||||
ADD_SIGNALS_IMPL_WRAPPER(NotifyNetworkActiveChanged);
|
ADD_SIGNALS_IMPL_WRAPPER(NotifyNetworkActiveChanged);
|
||||||
ADD_SIGNALS_IMPL_WRAPPER(NotifyAlertChanged);
|
ADD_SIGNALS_IMPL_WRAPPER(NotifyAlertChanged);
|
||||||
@@ -45,6 +47,7 @@ ADD_SIGNALS_IMPL_WRAPPER(BannedListChanged);
|
|||||||
bool CClientUIInterface::ThreadSafeMessageBox(const bilingual_str& message, const std::string& caption, unsigned int style) { return g_ui_signals.ThreadSafeMessageBox(message, caption, style).value_or(false);}
|
bool CClientUIInterface::ThreadSafeMessageBox(const bilingual_str& message, const std::string& caption, unsigned int style) { return g_ui_signals.ThreadSafeMessageBox(message, caption, style).value_or(false);}
|
||||||
bool CClientUIInterface::ThreadSafeQuestion(const bilingual_str& message, const std::string& non_interactive_message, const std::string& caption, unsigned int style) { return g_ui_signals.ThreadSafeQuestion(message, non_interactive_message, caption, style).value_or(false);}
|
bool CClientUIInterface::ThreadSafeQuestion(const bilingual_str& message, const std::string& non_interactive_message, const std::string& caption, unsigned int style) { return g_ui_signals.ThreadSafeQuestion(message, non_interactive_message, caption, style).value_or(false);}
|
||||||
void CClientUIInterface::InitMessage(const std::string& message) { return g_ui_signals.InitMessage(message); }
|
void CClientUIInterface::InitMessage(const std::string& message) { return g_ui_signals.InitMessage(message); }
|
||||||
|
void CClientUIInterface::InitWallet() { return g_ui_signals.InitWallet(); }
|
||||||
void CClientUIInterface::NotifyNumConnectionsChanged(int newNumConnections) { return g_ui_signals.NotifyNumConnectionsChanged(newNumConnections); }
|
void CClientUIInterface::NotifyNumConnectionsChanged(int newNumConnections) { return g_ui_signals.NotifyNumConnectionsChanged(newNumConnections); }
|
||||||
void CClientUIInterface::NotifyNetworkActiveChanged(bool networkActive) { return g_ui_signals.NotifyNetworkActiveChanged(networkActive); }
|
void CClientUIInterface::NotifyNetworkActiveChanged(bool networkActive) { return g_ui_signals.NotifyNetworkActiveChanged(networkActive); }
|
||||||
void CClientUIInterface::NotifyAlertChanged() { return g_ui_signals.NotifyAlertChanged(); }
|
void CClientUIInterface::NotifyAlertChanged() { return g_ui_signals.NotifyAlertChanged(); }
|
||||||
|
|||||||
@@ -82,6 +82,9 @@ public:
|
|||||||
/** Progress message during initialization. */
|
/** Progress message during initialization. */
|
||||||
ADD_SIGNALS_DECL_WRAPPER(InitMessage, void, const std::string& message);
|
ADD_SIGNALS_DECL_WRAPPER(InitMessage, void, const std::string& message);
|
||||||
|
|
||||||
|
/** Wallet client created. */
|
||||||
|
ADD_SIGNALS_DECL_WRAPPER(InitWallet, void, );
|
||||||
|
|
||||||
/** Number of network connections changed. */
|
/** Number of network connections changed. */
|
||||||
ADD_SIGNALS_DECL_WRAPPER(NotifyNumConnectionsChanged, void, int newNumConnections);
|
ADD_SIGNALS_DECL_WRAPPER(NotifyNumConnectionsChanged, void, int newNumConnections);
|
||||||
|
|
||||||
|
|||||||
@@ -273,7 +273,6 @@ void BitcoinApplication::createSplashScreen(const NetworkStyle *networkStyle)
|
|||||||
// We don't hold a direct pointer to the splash screen after creation, but the splash
|
// We don't hold a direct pointer to the splash screen after creation, but the splash
|
||||||
// screen will take care of deleting itself when finish() happens.
|
// screen will take care of deleting itself when finish() happens.
|
||||||
m_splash->show();
|
m_splash->show();
|
||||||
connect(this, &BitcoinApplication::requestedInitialize, m_splash, &SplashScreen::handleLoadWallet);
|
|
||||||
connect(this, &BitcoinApplication::splashFinished, m_splash, &SplashScreen::finish);
|
connect(this, &BitcoinApplication::splashFinished, m_splash, &SplashScreen::finish);
|
||||||
connect(this, &BitcoinApplication::requestedShutdown, m_splash, &QWidget::close);
|
connect(this, &BitcoinApplication::requestedShutdown, m_splash, &QWidget::close);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ void SplashScreen::subscribeToCoreSignals()
|
|||||||
// Connect signals to client
|
// Connect signals to client
|
||||||
m_handler_init_message = m_node->handleInitMessage(std::bind(InitMessage, this, std::placeholders::_1));
|
m_handler_init_message = m_node->handleInitMessage(std::bind(InitMessage, this, std::placeholders::_1));
|
||||||
m_handler_show_progress = m_node->handleShowProgress(std::bind(ShowProgress, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
m_handler_show_progress = m_node->handleShowProgress(std::bind(ShowProgress, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
|
m_handler_init_wallet = m_node->handleInitWallet([this]() { handleLoadWallet(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void SplashScreen::handleLoadWallet()
|
void SplashScreen::handleLoadWallet()
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ private:
|
|||||||
bool m_shutdown = false;
|
bool m_shutdown = false;
|
||||||
std::unique_ptr<interfaces::Handler> m_handler_init_message;
|
std::unique_ptr<interfaces::Handler> m_handler_init_message;
|
||||||
std::unique_ptr<interfaces::Handler> m_handler_show_progress;
|
std::unique_ptr<interfaces::Handler> m_handler_show_progress;
|
||||||
|
std::unique_ptr<interfaces::Handler> m_handler_init_wallet;
|
||||||
std::unique_ptr<interfaces::Handler> m_handler_load_wallet;
|
std::unique_ptr<interfaces::Handler> m_handler_load_wallet;
|
||||||
std::list<std::unique_ptr<interfaces::Wallet>> m_connected_wallets;
|
std::list<std::unique_ptr<interfaces::Wallet>> m_connected_wallets;
|
||||||
std::list<std::unique_ptr<interfaces::Handler>> m_connected_wallet_handlers;
|
std::list<std::unique_ptr<interfaces::Handler>> m_connected_wallet_handlers;
|
||||||
|
|||||||
Reference in New Issue
Block a user