diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 63dab29972d..1e7ad3fc6b8 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -169,7 +169,7 @@ bool RemoveWallet(WalletContext& context, const std::shared_ptr& wallet WITH_LOCK(wallet->cs_wallet, wallet->WriteBestBlock()); // Unregister with the validation interface which also drops shared pointers. - wallet->m_chain_notifications_handler.reset(); + wallet->DisconnectChainNotifications(); { LOCK(context.wallets_mutex); std::vector>::iterator i = std::find(context.wallets.begin(), context.wallets.end(), wallet); @@ -3117,7 +3117,7 @@ std::shared_ptr CWallet::CreateNew(WalletContext& context, const std::s walletInstance->TopUpKeyPool(); if (chain && !AttachChain(walletInstance, *chain, /*rescan_required=*/false, error, warnings)) { - walletInstance->m_chain_notifications_handler.reset(); // Reset this pointer so that the wallet will actually be unloaded + walletInstance->DisconnectChainNotifications(); return nullptr; } @@ -3158,7 +3158,7 @@ std::shared_ptr CWallet::LoadExisting(WalletContext& context, const std walletInstance->TopUpKeyPool(); if (chain && !AttachChain(walletInstance, *chain, rescan_required, error, warnings)) { - walletInstance->m_chain_notifications_handler.reset(); // Reset this pointer so that the wallet will actually be unloaded + walletInstance->DisconnectChainNotifications(); return nullptr; } @@ -4577,4 +4577,14 @@ std::optional CWallet::GetTXO(const COutPoint& outpoint) const } return it->second; } + +void CWallet::DisconnectChainNotifications() +{ + if (m_chain_notifications_handler) { + m_chain_notifications_handler->disconnect(); + chain().waitForNotifications(); + m_chain_notifications_handler.reset(); + } +} + } // namespace wallet diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index e3d362360c4..fd4b368d781 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1072,6 +1072,9 @@ public: //! Find the private key for the given key id from the wallet's descriptors, if available //! Returns nullopt when no descriptor has the key or if the wallet is locked. std::optional GetKey(const CKeyID& keyid) const; + + //! Disconnect chain notifications and wait for all notifications to be processed + void DisconnectChainNotifications(); }; /**