diff options
| author | xiphon <xiphon@protonmail.com> | 2020-04-27 12:39:41 +0000 |
|---|---|---|
| committer | xiphon <xiphon@protonmail.com> | 2020-04-27 12:46:15 +0000 |
| commit | 9748974ce04207e6d80b2cff99980cd614608d86 (patch) | |
| tree | c46045bd0a5f31dd22f21f028f4252b34578df88 /src | |
| parent | 585fb2810dc0d9b79255b9bd479559b36aa087d8 (diff) | |
| download | monzero-gui-9748974ce04207e6d80b2cff99980cd614608d86.tar.gz monzero-gui-9748974ce04207e6d80b2cff99980cd614608d86.tar.xz monzero-gui-9748974ce04207e6d80b2cff99980cd614608d86.zip | |
DaemonManager: fix memory leak
Diffstat (limited to 'src')
| -rw-r--r-- | src/daemon/DaemonManager.cpp | 21 | ||||
| -rw-r--r-- | src/daemon/DaemonManager.h | 6 |
2 files changed, 20 insertions, 7 deletions
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 <QElapsedTimer> #include <QFile> +#include <QMutexLocker> #include <QThread> #include <QFileInfo> #include <QDir> @@ -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 <memory> + +#include <QMutex> #include <QObject> #include <QUrl> #include <QProcess> @@ -78,7 +81,8 @@ private: static DaemonManager * m_instance; static QStringList m_clArgs; - QProcess *m_daemon; + std::unique_ptr<QProcess> m_daemon; + QMutex m_daemonMutex; bool initialized = false; QString m_monerod; bool m_has_daemon = true; |
