From 2ed59f41ed7f02cf99f75f34637bfa75ae427097 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Sat, 25 Feb 2017 14:57:39 +0100 Subject: Daemon manager improvements --- src/daemon/DaemonManager.cpp | 85 ++++++++++++++++++++++++++++++++++++++------ src/daemon/DaemonManager.h | 5 +++ 2 files changed, 80 insertions(+), 10 deletions(-) (limited to 'src') 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 future = QtConcurrent::run(this, &DaemonManager::startWatcher, testnet); + QFutureWatcher * watcher = new QFutureWatcher(); + connect(watcher, &QFutureWatcher::finished, + this, [this, watcher]() { + QFuture 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 future = QtConcurrent::run(this, &DaemonManager::stopWatcher, testnet); + QFutureWatcher * watcher = new QFutureWatcher(); + connect(watcher, &QFutureWatcher::finished, + this, [this, watcher]() { + QFuture 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; }; -- cgit v1.2.3