From 15c51e2e2b99ee3b31846f3a514590c884f59345 Mon Sep 17 00:00:00 2001 From: tobtoht Date: Fri, 16 Oct 2020 15:43:28 +0200 Subject: [PATCH] Bugfix: fix wallet closing issues by partially reverting #63 --- src/libwalletqt/Wallet.cpp | 93 ++++++-------------------------------- src/libwalletqt/Wallet.h | 11 ++--- src/mainwindow.cpp | 8 ++-- 3 files changed, 21 insertions(+), 91 deletions(-) diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index e0c55c7..53c5dac 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -3,10 +3,6 @@ #include "Wallet.h" -#include -#include -#include - #include "PendingTransaction.h" #include "UnsignedTransaction.h" #include "TransactionHistory.h" @@ -32,8 +28,6 @@ #include #include -#include "utils/ScopeGuard.h" - namespace { static const int DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS = 5; static const int DAEMON_BLOCKCHAIN_TARGET_HEIGHT_CACHE_TTL_SECONDS = 30; @@ -107,19 +101,6 @@ bool Wallet::disconnected() const return m_disconnected; } -bool Wallet::refreshing() const -{ - return m_refreshing; -} - -void Wallet::refreshingSet(bool value) -{ - if (m_refreshing.exchange(value) != value) - { - emit refreshingChanged(); - } -} - void Wallet::setConnectionStatus(ConnectionStatus value) { if (m_connectionStatus == value) @@ -264,7 +245,7 @@ void Wallet::initAsync( emit walletCreationHeightChanged(); qDebug() << "init async finished - starting refresh"; connected(true); - startRefresh(); + m_walletImpl->startRefresh(); } }); if (future.first) @@ -475,36 +456,20 @@ bool Wallet::importOutputs(const QString& path) { return m_walletImpl->importOutputs(path.toStdString()); } -bool Wallet::refresh(bool historyAndSubaddresses /* = true */) +bool Wallet::refresh() { - refreshingSet(true); - const auto cleanup = sg::make_scope_guard([this]() noexcept { - refreshingSet(false); - }); - - { - QMutexLocker locker(&m_asyncMutex); - - bool result = m_walletImpl->refresh(); - if (historyAndSubaddresses) - { - m_history->refresh(currentSubaddressAccount()); - m_subaddress->refresh(currentSubaddressAccount()); - m_subaddressAccount->getAll(); - } - - return result; - } + qDebug() << "refresh async"; + m_walletImpl->refreshAsync(); } -void Wallet::startRefresh() +void Wallet::startRefresh() const { - m_refreshEnabled = true; + m_walletImpl->startRefresh(); } -void Wallet::pauseRefresh() +void Wallet::pauseRefresh() const { - m_refreshEnabled = false; + m_walletImpl->pauseRefresh(); } PendingTransaction *Wallet::createTransaction(const QString &dst_addr, const QString &payment_id, @@ -1083,8 +1048,6 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent) , m_subaddressAccount(nullptr) , m_subaddressAccountModel(nullptr) , m_coinsModel(nullptr) - , m_refreshEnabled(false) - , m_refreshing(false) , m_scheduler(this) { m_history = new TransactionHistory(m_walletImpl->history(), this); @@ -1103,8 +1066,6 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent) m_connectionStatusRunning = false; m_daemonUsername = ""; m_daemonPassword = ""; - - startRefreshThread(); } Wallet::~Wallet() @@ -1129,42 +1090,14 @@ Wallet::~Wallet() //Monero::WalletManagerFactory::getWalletManager()->closeWallet(m_walletImpl); if(status() == Status_Critical) qDebug("Not storing wallet cache"); - else if( m_walletImpl->store("")) - qDebug("Wallet cache stored successfully"); - else - qDebug("Error storing wallet cache"); + // Don't store on wallet close for now +// else if( m_walletImpl->store("")) +// qDebug("Wallet cache stored successfully"); +// else +// qDebug("Error storing wallet cache"); delete m_walletImpl; m_walletImpl = NULL; delete m_walletListener; m_walletListener = NULL; qDebug("m_walletImpl deleted"); } - -void Wallet::startRefreshThread() -{ - const auto future = m_scheduler.run([this] { - static constexpr const size_t refreshIntervalSec = 10; - static constexpr const size_t intervalResolutionMs = 100; - - auto last = std::chrono::steady_clock::now(); - while (!m_scheduler.stopping()) - { - if (m_refreshEnabled) - { - const auto now = std::chrono::steady_clock::now(); - const auto elapsed = std::chrono::duration_cast(now - last).count(); - if (elapsed >= refreshIntervalSec) - { - refresh(false); - last = std::chrono::steady_clock::now(); - } - } - - std::this_thread::sleep_for(std::chrono::milliseconds(intervalResolutionMs)); - } - }); - if (!future.first) - { - throw std::runtime_error("failed to start auto refresh thread"); - } -} diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index c26120c..ac2c5db 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -50,7 +50,6 @@ class Wallet : public QObject, public PassprasePrompter { Q_OBJECT Q_PROPERTY(bool disconnected READ disconnected NOTIFY disconnectedChanged) - Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged) Q_PROPERTY(QString seed READ getSeed) Q_PROPERTY(QString seedLanguage READ getSeedLanguage) Q_PROPERTY(Status status READ status) @@ -200,11 +199,11 @@ public: Q_INVOKABLE bool importOutputs(const QString& path); //! refreshes the wallet - Q_INVOKABLE bool refresh(bool historyAndSubaddresses = true); + Q_INVOKABLE bool refresh(); // pause/resume refresh - Q_INVOKABLE void startRefresh(); - Q_INVOKABLE void pauseRefresh(); + Q_INVOKABLE void startRefresh() const; + Q_INVOKABLE void pauseRefresh() const; //! returns current wallet's block height //! (can be less than daemon's blockchain height when wallet sync in progress) @@ -406,7 +405,6 @@ signals: void currentSubaddressAccountChanged() const; void disconnectedChanged() const; void proxyAddressChanged() const; - void refreshingChanged() const; private: Wallet(QObject * parent = nullptr); @@ -424,12 +422,9 @@ private: const QString& proxyAddress); bool disconnected() const; - bool refreshing() const; - void refreshingSet(bool value); void setConnectionStatus(ConnectionStatus value); QString getProxyAddress() const; void setProxyAddress(QString address); - void startRefreshThread(); private: friend class WalletManager; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5f682b6..9d210b1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -505,7 +505,11 @@ WalletWizard *MainWindow::createWizard(WalletWizard::Page startPage){ void MainWindow::showWizard(WalletWizard::Page startPage) { this->setEnabled(false); - m_wizard = this->createWizard(startPage); + if (m_wizard == nullptr) + m_wizard = this->createWizard(startPage); + m_wizard->setStartId(startPage); + m_wizard->restart(); + m_wizard->setEnabled(true); m_wizard->show(); } @@ -558,8 +562,6 @@ void MainWindow::onWalletOpened() { qDebug() << Q_FUNC_INFO; if(m_wizard != nullptr) { m_wizard->hide(); - m_wizard->disconnect(); - m_wizard->deleteLater(); } this->raise();