Daemon manager improvements

This commit is contained in:
Jaquee
2017-02-25 14:57:39 +01:00
parent ce10016408
commit 2ed59f41ed
4 changed files with 83 additions and 15 deletions

View File

@@ -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)
{