Browse Source

Fix shutdown in case of errors during initialization

PR #10286 introduced a few steps which are not robust to early shutdown
in initialization.

Stumbled upon this with #11781, not sure if there are other scenarios
that can trigger it, but it's harden against this in any case.
0.16
Wladimir J. van der Laan 7 years ago
parent
commit
d31e5c1d0f
  1. 4
      src/init.cpp
  2. 7
      src/validationinterface.cpp

4
src/init.cpp

@ -193,8 +193,8 @@ void Shutdown()
// Because these depend on each-other, we make sure that neither can be // Because these depend on each-other, we make sure that neither can be
// using the other before destroying them. // using the other before destroying them.
UnregisterValidationInterface(peerLogic.get()); if (peerLogic) UnregisterValidationInterface(peerLogic.get());
if(g_connman) g_connman->Stop(); if (g_connman) g_connman->Stop();
peerLogic.reset(); peerLogic.reset();
g_connman.reset(); g_connman.reset();

7
src/validationinterface.cpp

@ -49,7 +49,9 @@ void CMainSignals::UnregisterBackgroundSignalScheduler() {
} }
void CMainSignals::FlushBackgroundCallbacks() { void CMainSignals::FlushBackgroundCallbacks() {
m_internals->m_schedulerClient.EmptyQueue(); if (m_internals) {
m_internals->m_schedulerClient.EmptyQueue();
}
} }
void CMainSignals::RegisterWithMempoolSignals(CTxMemPool& pool) { void CMainSignals::RegisterWithMempoolSignals(CTxMemPool& pool) {
@ -92,6 +94,9 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn) {
} }
void UnregisterAllValidationInterfaces() { void UnregisterAllValidationInterfaces() {
if (!g_signals.m_internals) {
return;
}
g_signals.m_internals->BlockChecked.disconnect_all_slots(); g_signals.m_internals->BlockChecked.disconnect_all_slots();
g_signals.m_internals->Broadcast.disconnect_all_slots(); g_signals.m_internals->Broadcast.disconnect_all_slots();
g_signals.m_internals->Inventory.disconnect_all_slots(); g_signals.m_internals->Inventory.disconnect_all_slots();

Loading…
Cancel
Save