mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-05 14:06:27 -05:00
Fix segfault when shutdown during wallet open
If you open a wallet and send a shutdown signal during that process, the GUI will segfault due to some queued wallet events happening after the wallet controller is deleted. This is a minimal fix for those issues.
This commit is contained in:
parent
65de8eeeca
commit
9a1d73fdff
3 changed files with 17 additions and 6 deletions
|
@ -680,6 +680,10 @@ void BitcoinGUI::setWalletController(WalletController* wallet_controller)
|
||||||
|
|
||||||
GUIUtil::ExceptionSafeConnect(wallet_controller, &WalletController::walletAdded, this, &BitcoinGUI::addWallet);
|
GUIUtil::ExceptionSafeConnect(wallet_controller, &WalletController::walletAdded, this, &BitcoinGUI::addWallet);
|
||||||
connect(wallet_controller, &WalletController::walletRemoved, this, &BitcoinGUI::removeWallet);
|
connect(wallet_controller, &WalletController::walletRemoved, this, &BitcoinGUI::removeWallet);
|
||||||
|
connect(wallet_controller, &WalletController::destroyed, this, [this] {
|
||||||
|
// wallet_controller gets destroyed manually, but it leaves our member copy dangling
|
||||||
|
m_wallet_controller = nullptr;
|
||||||
|
});
|
||||||
|
|
||||||
auto activity = new LoadWalletsActivity(m_wallet_controller, this);
|
auto activity = new LoadWalletsActivity(m_wallet_controller, this);
|
||||||
activity->load();
|
activity->load();
|
||||||
|
@ -692,7 +696,7 @@ WalletController* BitcoinGUI::getWalletController()
|
||||||
|
|
||||||
void BitcoinGUI::addWallet(WalletModel* walletModel)
|
void BitcoinGUI::addWallet(WalletModel* walletModel)
|
||||||
{
|
{
|
||||||
if (!walletFrame) return;
|
if (!walletFrame || !m_wallet_controller) return;
|
||||||
|
|
||||||
WalletView* wallet_view = new WalletView(walletModel, platformStyle, walletFrame);
|
WalletView* wallet_view = new WalletView(walletModel, platformStyle, walletFrame);
|
||||||
if (!walletFrame->addView(wallet_view)) return;
|
if (!walletFrame->addView(wallet_view)) return;
|
||||||
|
@ -742,7 +746,7 @@ void BitcoinGUI::removeWallet(WalletModel* walletModel)
|
||||||
|
|
||||||
void BitcoinGUI::setCurrentWallet(WalletModel* wallet_model)
|
void BitcoinGUI::setCurrentWallet(WalletModel* wallet_model)
|
||||||
{
|
{
|
||||||
if (!walletFrame) return;
|
if (!walletFrame || !m_wallet_controller) return;
|
||||||
walletFrame->setCurrentWallet(wallet_model);
|
walletFrame->setCurrentWallet(wallet_model);
|
||||||
for (int index = 0; index < m_wallet_selector->count(); ++index) {
|
for (int index = 0; index < m_wallet_selector->count(); ++index) {
|
||||||
if (m_wallet_selector->itemData(index).value<WalletModel*>() == wallet_model) {
|
if (m_wallet_selector->itemData(index).value<WalletModel*>() == wallet_model) {
|
||||||
|
|
|
@ -600,10 +600,15 @@ SendCoinsEntry *SendCoinsDialog::addEntry()
|
||||||
entry->clear();
|
entry->clear();
|
||||||
entry->setFocus();
|
entry->setFocus();
|
||||||
ui->scrollAreaWidgetContents->resize(ui->scrollAreaWidgetContents->sizeHint());
|
ui->scrollAreaWidgetContents->resize(ui->scrollAreaWidgetContents->sizeHint());
|
||||||
qApp->processEvents();
|
|
||||||
QScrollBar* bar = ui->scrollArea->verticalScrollBar();
|
// Scroll to the newly added entry on a QueuedConnection because Qt doesn't
|
||||||
if(bar)
|
// adjust the scroll area and scrollbar immediately when the widget is added.
|
||||||
bar->setSliderPosition(bar->maximum());
|
// Invoking on a DirectConnection will only scroll to the second-to-last entry.
|
||||||
|
QMetaObject::invokeMethod(ui->scrollArea, [this] {
|
||||||
|
if (ui->scrollArea->verticalScrollBar()) {
|
||||||
|
ui->scrollArea->verticalScrollBar()->setValue(ui->scrollArea->verticalScrollBar()->maximum());
|
||||||
|
}
|
||||||
|
}, Qt::QueuedConnection);
|
||||||
|
|
||||||
updateTabsAndLabels();
|
updateTabsAndLabels();
|
||||||
return entry;
|
return entry;
|
||||||
|
|
|
@ -212,6 +212,8 @@ void TestGUI(interfaces::Node& node)
|
||||||
QCOMPARE(transactionTableModel->rowCount({}), 105);
|
QCOMPARE(transactionTableModel->rowCount({}), 105);
|
||||||
uint256 txid1 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 5 * COIN, /*rbf=*/false);
|
uint256 txid1 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 5 * COIN, /*rbf=*/false);
|
||||||
uint256 txid2 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 10 * COIN, /*rbf=*/true);
|
uint256 txid2 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 10 * COIN, /*rbf=*/true);
|
||||||
|
// Transaction table model updates on a QueuedConnection, so process events to ensure it's updated.
|
||||||
|
qApp->processEvents();
|
||||||
QCOMPARE(transactionTableModel->rowCount({}), 107);
|
QCOMPARE(transactionTableModel->rowCount({}), 107);
|
||||||
QVERIFY(FindTx(*transactionTableModel, txid1).isValid());
|
QVERIFY(FindTx(*transactionTableModel, txid1).isValid());
|
||||||
QVERIFY(FindTx(*transactionTableModel, txid2).isValid());
|
QVERIFY(FindTx(*transactionTableModel, txid2).isValid());
|
||||||
|
|
Loading…
Add table
Reference in a new issue