From ddf84628ca2563c5829564c4041b62ec0ea73599 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 9 Jan 2026 00:32:00 +0200 Subject: [PATCH] remove shared pointer from JavaChecker from #2996(it doesn't necesary fixes it as I can't reproduce it) This just removes the shared pointer of the process from the JavaChecker Signed-off-by: Trial97 --- launcher/java/JavaChecker.cpp | 59 +++++++++++++++++++++-------------- launcher/java/JavaChecker.h | 6 ++-- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index 5c52c653d..7a1f0a4c6 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -41,7 +41,6 @@ #include #include "Commandline.h" -#include "FileSystem.h" #include "java/JavaUtils.h" JavaChecker::JavaChecker(QString path, QString args, int minMem, int maxMem, int permGen, int id) @@ -61,8 +60,10 @@ void JavaChecker::executeTask() #endif QStringList args; - - process.reset(new QProcess()); + if (m_process) { + m_process->deleteLater(); + } + m_process = new QProcess(this); if (m_args.size()) { auto extraArgs = Commandline::splitArgs(m_args); args.append(extraArgs); @@ -78,25 +79,25 @@ void JavaChecker::executeTask() } args.append({ "-jar", checkerJar }); - process->setArguments(args); - process->setProgram(m_path); - process->setProcessChannelMode(QProcess::SeparateChannels); - process->setProcessEnvironment(CleanEnviroment()); + m_process->setArguments(args); + m_process->setProgram(m_path); + m_process->setProcessChannelMode(QProcess::SeparateChannels); + m_process->setProcessEnvironment(CleanEnviroment()); qDebug() << "Running java checker:" << m_path << args.join(" "); - connect(process.get(), &QProcess::finished, this, &JavaChecker::finished); - connect(process.get(), &QProcess::errorOccurred, this, &JavaChecker::error); - connect(process.get(), &QProcess::readyReadStandardOutput, this, &JavaChecker::stdoutReady); - connect(process.get(), &QProcess::readyReadStandardError, this, &JavaChecker::stderrReady); - connect(&killTimer, &QTimer::timeout, this, &JavaChecker::timeout); - killTimer.setSingleShot(true); - killTimer.start(15000); - process->start(); + connect(m_process, &QProcess::finished, this, &JavaChecker::finished); + connect(m_process, &QProcess::errorOccurred, this, &JavaChecker::error); + connect(m_process, &QProcess::readyReadStandardOutput, this, &JavaChecker::stdoutReady); + connect(m_process, &QProcess::readyReadStandardError, this, &JavaChecker::stderrReady); + connect(&m_killTimer, &QTimer::timeout, this, &JavaChecker::timeout); + m_killTimer.setSingleShot(true); + m_killTimer.start(15000); + m_process->start(); } void JavaChecker::stdoutReady() { - QByteArray data = process->readAllStandardOutput(); + QByteArray data = m_process->readAllStandardOutput(); QString added = QString::fromLocal8Bit(data); added.remove('\r'); m_stdout += added; @@ -104,7 +105,7 @@ void JavaChecker::stdoutReady() void JavaChecker::stderrReady() { - QByteArray data = process->readAllStandardError(); + QByteArray data = m_process->readAllStandardError(); QString added = QString::fromLocal8Bit(data); added.remove('\r'); m_stderr += added; @@ -112,9 +113,11 @@ void JavaChecker::stderrReady() void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) { - killTimer.stop(); - QProcessPtr _process = process; - process.reset(); + m_killTimer.stop(); + if (m_process) { + m_process->deleteLater(); + m_process = nullptr; + } Result result = { m_path, @@ -181,10 +184,10 @@ void JavaChecker::error(QProcess::ProcessError err) if (err == QProcess::FailedToStart) { qDebug() << "Java checker has failed to start."; qDebug() << "Process environment:"; - qDebug() << process->environment(); + qDebug() << m_process->environment(); qDebug() << "Native environment:"; qDebug() << QProcessEnvironment::systemEnvironment().toStringList(); - killTimer.stop(); + m_killTimer.stop(); emit checkFinished({ m_path, m_id }); } emitSucceeded(); @@ -193,8 +196,16 @@ void JavaChecker::error(QProcess::ProcessError err) void JavaChecker::timeout() { // NO MERCY. NO ABUSE. - if (process) { + if (m_process) { qDebug() << "Java checker has been killed by timeout."; - process->kill(); + m_process->kill(); + } +} + +JavaChecker::~JavaChecker() +{ + if (m_process) { + m_process->deleteLater(); + m_process = nullptr; } } diff --git a/launcher/java/JavaChecker.h b/launcher/java/JavaChecker.h index a04b68170..8142d08f6 100644 --- a/launcher/java/JavaChecker.h +++ b/launcher/java/JavaChecker.h @@ -9,7 +9,6 @@ class JavaChecker : public Task { Q_OBJECT public: - using QProcessPtr = shared_qobject_ptr; using Ptr = shared_qobject_ptr; struct Result { @@ -26,6 +25,7 @@ class JavaChecker : public Task { }; explicit JavaChecker(QString path, QString args, int minMem = 0, int maxMem = 0, int permGen = 0, int id = 0); + virtual ~JavaChecker(); signals: void checkFinished(const Result& result); @@ -34,8 +34,8 @@ class JavaChecker : public Task { virtual void executeTask() override; private: - QProcessPtr process; - QTimer killTimer; + QProcess* m_process = nullptr; + QTimer m_killTimer; QString m_stdout; QString m_stderr;