aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaquee <jaquee.monero@gmail.com>2017-02-25 14:57:39 +0100
committerJaquee <jaquee.monero@gmail.com>2017-02-25 14:57:39 +0100
commit2ed59f41ed7f02cf99f75f34637bfa75ae427097 (patch)
tree86fa73ccd030da966cba1a66c15afa659b9632df
parentce10016408118eaba0df0d46d156e677aa8fece2 (diff)
downloadmonzero-gui-2ed59f41ed7f02cf99f75f34637bfa75ae427097.tar.gz
monzero-gui-2ed59f41ed7f02cf99f75f34637bfa75ae427097.tar.xz
monzero-gui-2ed59f41ed7f02cf99f75f34637bfa75ae427097.zip
Daemon manager improvements
-rw-r--r--main.qml6
-rw-r--r--pages/Settings.qml2
-rw-r--r--src/daemon/DaemonManager.cpp85
-rw-r--r--src/daemon/DaemonManager.h5
4 files changed, 83 insertions, 15 deletions
diff --git a/main.qml b/main.qml
index 843c43b4..553c9521 100644
--- a/main.qml
+++ b/main.qml
@@ -235,7 +235,6 @@ ApplicationWindow {
}
function connectWallet(wallet) {
- showProcessingSplash("Please wait...")
currentWallet = wallet
updateSyncing(false)
@@ -341,9 +340,6 @@ ApplicationWindow {
function onWalletRefresh() {
console.log(">>> wallet refreshed")
- if (splash.visible) {
- hideProcessingSplash()
- }
// Daemon connected
leftPanel.networkStatus.connected = currentWallet.connected()
@@ -398,6 +394,7 @@ ApplicationWindow {
console.log("daemon started");
daemonRunning = true;
hideProcessingSplash();
+ currentWallet.connected(true);
}
function onDaemonStopped(){
console.log("daemon stopped");
@@ -1233,6 +1230,7 @@ ApplicationWindow {
}
onClosing: {
// Close wallet non async on exit
+ daemonManager.exit();
walletManager.closeWallet();
}
diff --git a/pages/Settings.qml b/pages/Settings.qml
index 651357cb..0bd1816c 100644
--- a/pages/Settings.qml
+++ b/pages/Settings.qml
@@ -407,7 +407,7 @@ Rectangle {
console.log("Settings page loaded");
initSettings();
viewOnly = currentWallet.viewOnly;
- daemonManager.running(persistentSettings.testnet)
+ appWindow.daemonRunning = daemonManager.running(persistentSettings.testnet)
}
// fires only once
diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp
index 606448d9..855058eb 100644
--- a/src/daemon/DaemonManager.cpp
+++ b/src/daemon/DaemonManager.cpp
@@ -67,11 +67,22 @@ bool DaemonManager::start(const QString &flags, bool testnet)
// add state changed listener
connect(m_daemon,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(stateChanged(QProcess::ProcessState)));
- if (!started) {
+ if (!started)
qDebug() << "Daemon start error: " + m_daemon->errorString();
- } else {
- emit daemonStarted();
- }
+
+ // Start start watcher
+ QFuture<bool> future = QtConcurrent::run(this, &DaemonManager::startWatcher, testnet);
+ QFutureWatcher<bool> * watcher = new QFutureWatcher<bool>();
+ connect(watcher, &QFutureWatcher<bool>::finished,
+ this, [this, watcher]() {
+ QFuture<bool> future = watcher->future();
+ watcher->deleteLater();
+ if(future.result()) {
+ emit daemonStarted();
+ }
+ });
+ watcher->setFuture(future);
+
return started;
}
@@ -79,13 +90,63 @@ bool DaemonManager::start(const QString &flags, bool testnet)
bool DaemonManager::stop(bool testnet)
{
QString message;
- bool stopped = sendCommand("exit",testnet,message);
+ sendCommand("exit",testnet,message);
qDebug() << message;
- if(stopped)
- emit daemonStopped();
- return stopped;
+
+ // Start stop watcher - Will kill if not shutting down
+ QFuture<bool> future = QtConcurrent::run(this, &DaemonManager::stopWatcher, testnet);
+ QFutureWatcher<bool> * watcher = new QFutureWatcher<bool>();
+ connect(watcher, &QFutureWatcher<bool>::finished,
+ this, [this, watcher]() {
+ QFuture<bool> future = watcher->future();
+ watcher->deleteLater();
+ if(future.result()) {
+ emit daemonStopped();
+ }
+ });
+ watcher->setFuture(future);
+
+ return true;
}
+bool DaemonManager::startWatcher(bool testnet) const
+{
+ // Check if daemon is started every 2 seconds
+ while(true && !m_app_exit) {
+ QThread::sleep(2);
+ if(!running(testnet)) {
+ qDebug() << "daemon not running. checking again in 2 seconds.";
+ } else
+ return true;
+ }
+ return false;
+}
+
+bool DaemonManager::stopWatcher(bool testnet) const
+{
+ // Check if daemon is running every 2 seconds. Kill if still running after 10 seconds
+ int counter = 0;
+ while(true && !m_app_exit) {
+ QThread::sleep(2);
+ counter++;
+ if(running(testnet)) {
+ qDebug() << "Daemon still running. " << counter;
+ if(counter >= 5) {
+ qDebug() << "Killing it! ";
+#ifdef Q_OS_WIN
+ QProcess::execute("taskkill /F /IM monerod.exe");
+#else
+ QProcess::execute("pkill monerod");
+#endif
+ }
+
+ } else
+ return true;
+ }
+ return false;
+}
+
+
void DaemonManager::stateChanged(QProcess::ProcessState state)
{
qDebug() << "STATE CHANGED: " << state;
@@ -124,10 +185,8 @@ bool DaemonManager::running(bool testnet) const
// `./monerod status` returns BUSY when syncing.
// Treat busy as connected, until fixed upstream.
if (status.contains("Height:") || status.contains("BUSY") ) {
- emit daemonStarted();
return true;
}
- emit daemonStopped();
return false;
}
bool DaemonManager::sendCommand(const QString &cmd,bool testnet) const
@@ -155,6 +214,12 @@ bool DaemonManager::sendCommand(const QString &cmd,bool testnet, QString &messag
return started;
}
+void DaemonManager::exit()
+{
+ qDebug("DaemonManager: exit()");
+ m_app_exit = true;
+}
+
DaemonManager::DaemonManager(QObject *parent)
: QObject(parent)
{
diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h
index bd13ef60..b45b369f 100644
--- a/src/daemon/DaemonManager.h
+++ b/src/daemon/DaemonManager.h
@@ -20,9 +20,13 @@ public:
Q_INVOKABLE bool running(bool testnet) const;
// Send daemon command from qml and prints output in console window.
Q_INVOKABLE bool sendCommand(const QString &cmd, bool testnet) const;
+ Q_INVOKABLE void exit();
private:
+
bool sendCommand(const QString &cmd, bool testnet, QString &message) const;
+ bool startWatcher(bool testnet) const;
+ bool stopWatcher(bool testnet) const;
signals:
void daemonStarted() const;
void daemonStopped() const;
@@ -41,6 +45,7 @@ private:
bool initialized = false;
QString m_monerod;
bool m_has_daemon = true;
+ bool m_app_exit = false;
};