Skip to content

Commit 50c5f87

Browse files
committed
qml: Protect m_wallets in WalletQmlController with QMutex
1 parent ec3e68e commit 50c5f87

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

src/qml/walletqmlcontroller.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@ void WalletQmlController::setSelectedWallet(QString path)
4141
if (wallet.has_value()) {
4242
auto wallet_model = new WalletQmlModel(std::move(wallet.value()));
4343
wallet_model->moveToThread(this->thread());
44-
m_selected_wallet = wallet_model;
45-
m_wallets.push_back(m_selected_wallet);
44+
{
45+
QMutexLocker locker(&m_wallets_mutex);
46+
m_selected_wallet = wallet_model;
47+
m_wallets.push_back(m_selected_wallet);
48+
}
4649
Q_EMIT selectedWalletChanged();
4750
}
4851
});
@@ -56,6 +59,7 @@ WalletQmlModel* WalletQmlController::selectedWallet() const
5659
void WalletQmlController::unloadWallets()
5760
{
5861
m_handler_load_wallet->disconnect();
62+
QMutexLocker locker(&m_wallets_mutex);
5963
for (WalletQmlModel* wallet : m_wallets) {
6064
delete wallet;
6165
}
@@ -64,17 +68,20 @@ void WalletQmlController::unloadWallets()
6468

6569
void WalletQmlController::handleLoadWallet(std::unique_ptr<interfaces::Wallet> wallet)
6670
{
67-
if (!m_wallets.empty()) {
68-
QString name = QString::fromStdString(wallet->getWalletName());
69-
for (WalletQmlModel* wallet_model : m_wallets) {
70-
if (wallet_model->name() == name) {
71-
return;
71+
{
72+
QMutexLocker locker(&m_wallets_mutex);
73+
if (!m_wallets.empty()) {
74+
QString name = QString::fromStdString(wallet->getWalletName());
75+
for (WalletQmlModel* wallet_model : m_wallets) {
76+
if (wallet_model->name() == name) {
77+
return;
78+
}
7279
}
7380
}
74-
}
7581

76-
m_selected_wallet = new WalletQmlModel(std::move(wallet));
77-
m_wallets.push_back(m_selected_wallet);
82+
m_selected_wallet = new WalletQmlModel(std::move(wallet));
83+
m_wallets.push_back(m_selected_wallet);
84+
}
7885
Q_EMIT selectedWalletChanged();
7986
}
8087

src/qml/walletqmlcontroller.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <interfaces/node.h>
1111
#include <interfaces/wallet.h>
1212

13+
#include <QMutex>
1314
#include <QObject>
1415
#include <QThread>
1516
#include <memory>
@@ -41,6 +42,7 @@ public Q_SLOTS:
4142
WalletQmlModel* m_selected_wallet;
4243
QObject* m_worker;
4344
QThread* m_worker_thread;
45+
QMutex m_wallets_mutex;
4446
std::vector<WalletQmlModel*> m_wallets;
4547
std::unique_ptr<interfaces::Handler> m_handler_load_wallet;
4648
};

0 commit comments

Comments
 (0)