diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 74f1077a..90d10adf 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -29,6 +29,7 @@ #include "DaemonManager.h" #include #include +#include #include #include #include @@ -123,18 +124,20 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const qDebug() << "starting monerod " + m_monerod; qDebug() << "With command line arguments " << arguments; - m_daemon = new QProcess(); + QMutexLocker locker(&m_daemonMutex); + + m_daemon.reset(new QProcess()); initialized = true; // Connect output slots - connect (m_daemon, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); - connect (m_daemon, SIGNAL(readyReadStandardError()), this, SLOT(printError())); + connect(m_daemon.get(), SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); + connect(m_daemon.get(), SIGNAL(readyReadStandardError()), this, SLOT(printError())); // Start monerod bool started = m_daemon->startDetached(m_monerod, arguments); // add state changed listener - connect(m_daemon,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(stateChanged(QProcess::ProcessState))); + connect(m_daemon.get(), SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(stateChanged(QProcess::ProcessState))); if (!started) { qDebug() << "Daemon start error: " + m_daemon->errorString(); @@ -223,7 +226,10 @@ void DaemonManager::stateChanged(QProcess::ProcessState state) void DaemonManager::printOutput() { - QByteArray byteArray = m_daemon->readAllStandardOutput(); + QByteArray byteArray = [this]() { + QMutexLocker locker(&m_daemonMutex); + return m_daemon->readAllStandardOutput(); + }(); QStringList strLines = QString(byteArray).split("\n"); foreach (QString line, strLines) { @@ -234,7 +240,10 @@ void DaemonManager::printOutput() void DaemonManager::printError() { - QByteArray byteArray = m_daemon->readAllStandardError(); + QByteArray byteArray = [this]() { + QMutexLocker locker(&m_daemonMutex); + return m_daemon->readAllStandardError(); + }(); QStringList strLines = QString(byteArray).split("\n"); foreach (QString line, strLines) { diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index e670373c..83fb9cd1 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -29,6 +29,9 @@ #ifndef DAEMONMANAGER_H #define DAEMONMANAGER_H +#include + +#include #include #include #include @@ -78,7 +81,8 @@ private: static DaemonManager * m_instance; static QStringList m_clArgs; - QProcess *m_daemon; + std::unique_ptr m_daemon; + QMutex m_daemonMutex; bool initialized = false; QString m_monerod; bool m_has_daemon = true;