diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2019-02-04 10:45:10 +0100 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2019-02-04 11:09:58 +0100 |
commit | 64127b3098a1aab70200b6d07194dce072ad5cf2 (patch) | |
tree | f73cae4bb143a18ab0ac1854328a47ade2a62a42 | |
parent | 2fbf6a57d282d80c128c910dd1fcdd0ee0542654 (diff) | |
parent | 0dd6a8c12489ea4428b398a2328dde5d1a9fe39b (diff) |
Merge #15280: gui: Fix shutdown order
0dd6a8c12489ea4428b398a2328dde5d1a9fe39b Check m_internals in UnregisterValidationInterface (João Barbosa)
fd6d499bdacfa29f25b0f675375e3feaced08667 gui: Fix m_node.startShutdown() order (João Barbosa)
07b9aadcfc7cc72be9df344dd5715cf8fc78f0ad gui: Expose BitcoinGUI::unsubscribeFromCoreSignals (João Barbosa)
60e190ceb3563a8102d42fdfcbefccdd1b53e812 gui: Fix WalletController deletion (João Barbosa)
Pull request description:
This PR consists in small fixes in order to have a clean shutdown from the GUI.
Tree-SHA512: a9c641f202bc810698c4a39d5c5a1f54e54bdab098c412d65418879e00764a9db9f38383813914d591e24e097e49f177942b2ae6c57bba05dcc095e8a1d0b8f4
-rw-r--r-- | src/qt/bitcoin.cpp | 16 | ||||
-rw-r--r-- | src/qt/bitcoingui.h | 5 | ||||
-rw-r--r-- | src/validationinterface.cpp | 4 |
3 files changed, 16 insertions, 9 deletions
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index ca26131b95..85d79ee26c 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -218,6 +218,8 @@ BitcoinApplication::~BitcoinApplication() #ifdef ENABLE_WALLET delete paymentServer; paymentServer = nullptr; + delete m_wallet_controller; + m_wallet_controller = nullptr; #endif delete optionsModel; optionsModel = nullptr; @@ -307,18 +309,20 @@ void BitcoinApplication::requestShutdown() qDebug() << __func__ << ": Requesting shutdown"; startThread(); window->hide(); + // Must disconnect node signals otherwise current thread can deadlock since + // no event loop is running. + window->unsubscribeFromCoreSignals(); + // Request node shutdown, which can interrupt long operations, like + // rescanning a wallet. + m_node.startShutdown(); + // Unsetting the client model can cause the current thread to wait for node + // to complete an operation, like wait for a RPC execution to complate. window->setClientModel(nullptr); pollShutdownTimer->stop(); -#ifdef ENABLE_WALLET - delete m_wallet_controller; - m_wallet_controller = nullptr; -#endif delete clientModel; clientModel = nullptr; - m_node.startShutdown(); - // Request shutdown from core thread Q_EMIT requestedShutdown(); } diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index f1b76a6b64..c31cefe603 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -95,6 +95,9 @@ public: */ bool hasTrayIcon() const { return trayIcon; } + /** Disconnect core signals from GUI client */ + void unsubscribeFromCoreSignals(); + protected: void changeEvent(QEvent *e); void closeEvent(QCloseEvent *event); @@ -184,8 +187,6 @@ private: /** Connect core signals to GUI client */ void subscribeToCoreSignals(); - /** Disconnect core signals from GUI client */ - void unsubscribeFromCoreSignals(); /** Update UI with latest network info from model. */ void updateNetworkState(); diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index 2e13bef19e..70c274d20e 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -107,7 +107,9 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn) { } void UnregisterValidationInterface(CValidationInterface* pwalletIn) { - g_signals.m_internals->m_connMainSignals.erase(pwalletIn); + if (g_signals.m_internals) { + g_signals.m_internals->m_connMainSignals.erase(pwalletIn); + } } void UnregisterAllValidationInterfaces() { |