Cancel wallet balance timer when shutdown requested

This doesn't fix any current problem, but it makes balance checking code less
fragile, and prevents use-after free travis error in next commit:
https://travis-ci.org/github/bitcoin/bitcoin/jobs/675367629#L4240
pull/18587/head
Russell Yanofsky 5 years ago
parent 83f69fab3a
commit 2bc9b92ed8

@ -38,14 +38,15 @@
WalletModel::WalletModel(std::unique_ptr<interfaces::Wallet> wallet, ClientModel& client_model, const PlatformStyle *platformStyle, QObject *parent) : WalletModel::WalletModel(std::unique_ptr<interfaces::Wallet> wallet, ClientModel& client_model, const PlatformStyle *platformStyle, QObject *parent) :
QObject(parent), QObject(parent),
m_wallet(std::move(wallet)), m_wallet(std::move(wallet)),
m_client_model(client_model), m_client_model(&client_model),
m_node(client_model.node()), m_node(client_model.node()),
optionsModel(client_model.getOptionsModel()), optionsModel(client_model.getOptionsModel()),
addressTableModel(nullptr), addressTableModel(nullptr),
transactionTableModel(nullptr), transactionTableModel(nullptr),
recentRequestsTableModel(nullptr), recentRequestsTableModel(nullptr),
cachedEncryptionStatus(Unencrypted), cachedEncryptionStatus(Unencrypted),
cachedNumBlocks(0) cachedNumBlocks(0),
timer(new QTimer(this))
{ {
fHaveWatchOnly = m_wallet->haveWatchOnly(); fHaveWatchOnly = m_wallet->haveWatchOnly();
addressTableModel = new AddressTableModel(this); addressTableModel = new AddressTableModel(this);
@ -63,11 +64,16 @@ WalletModel::~WalletModel()
void WalletModel::startPollBalance() void WalletModel::startPollBalance()
{ {
// This timer will be fired repeatedly to update the balance // This timer will be fired repeatedly to update the balance
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &WalletModel::pollBalanceChanged); connect(timer, &QTimer::timeout, this, &WalletModel::pollBalanceChanged);
timer->start(MODEL_UPDATE_DELAY); timer->start(MODEL_UPDATE_DELAY);
} }
void WalletModel::setClientModel(ClientModel* client_model)
{
m_client_model = client_model;
if (!m_client_model) timer->stop();
}
void WalletModel::updateStatus() void WalletModel::updateStatus()
{ {
EncryptionStatus newEncryptionStatus = getEncryptionStatus(); EncryptionStatus newEncryptionStatus = getEncryptionStatus();

@ -144,6 +144,7 @@ public:
interfaces::Node& node() const { return m_node; } interfaces::Node& node() const { return m_node; }
interfaces::Wallet& wallet() const { return *m_wallet; } interfaces::Wallet& wallet() const { return *m_wallet; }
void setClientModel(ClientModel* client_model);
int getNumBlocks() const { return cachedNumBlocks; } int getNumBlocks() const { return cachedNumBlocks; }
QString getWalletName() const; QString getWalletName() const;
@ -161,7 +162,7 @@ private:
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_watch_only_changed; std::unique_ptr<interfaces::Handler> m_handler_watch_only_changed;
std::unique_ptr<interfaces::Handler> m_handler_can_get_addrs_changed; std::unique_ptr<interfaces::Handler> m_handler_can_get_addrs_changed;
ClientModel& m_client_model; ClientModel* m_client_model;
interfaces::Node& m_node; interfaces::Node& m_node;
bool fHaveWatchOnly; bool fHaveWatchOnly;
@ -179,6 +180,7 @@ private:
interfaces::WalletBalances m_cached_balances; interfaces::WalletBalances m_cached_balances;
EncryptionStatus cachedEncryptionStatus; EncryptionStatus cachedEncryptionStatus;
int cachedNumBlocks; int cachedNumBlocks;
QTimer* timer;
void subscribeToCoreSignals(); void subscribeToCoreSignals();
void unsubscribeFromCoreSignals(); void unsubscribeFromCoreSignals();

@ -97,6 +97,7 @@ void WalletView::setClientModel(ClientModel *_clientModel)
overviewPage->setClientModel(_clientModel); overviewPage->setClientModel(_clientModel);
sendCoinsPage->setClientModel(_clientModel); sendCoinsPage->setClientModel(_clientModel);
if (walletModel) walletModel->setClientModel(_clientModel);
} }
void WalletView::setWalletModel(WalletModel *_walletModel) void WalletView::setWalletModel(WalletModel *_walletModel)

Loading…
Cancel
Save