From 70ed30f9e6b47fbfb3151078ca61a2bb419feccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 7 Apr 2019 23:59:04 +0200 Subject: GH-2591 less std::shared_ptr and more shared_qobject_ptr This eliminates some weird crashes. --- api/gui/icons/IconList.h | 2 +- api/logic/BaseInstance.cpp | 7 +---- api/logic/BaseInstance.h | 12 ++++----- api/logic/NullInstance.h | 23 ++++++++-------- api/logic/java/JavaChecker.cpp | 4 +-- api/logic/java/JavaChecker.h | 6 +++-- api/logic/java/JavaCheckerJob.h | 2 +- api/logic/java/JavaInstallList.cpp | 2 +- api/logic/java/JavaInstallList.h | 4 ++- api/logic/java/launch/CheckJava.cpp | 2 +- api/logic/launch/LaunchTask.cpp | 8 +++--- api/logic/launch/LaunchTask.h | 8 +++--- api/logic/minecraft/MinecraftInstance.cpp | 41 +++++++++++++---------------- api/logic/minecraft/MinecraftInstance.h | 2 +- api/logic/minecraft/legacy/LegacyInstance.h | 3 ++- api/logic/tools/BaseProfiler.cpp | 3 ++- api/logic/tools/BaseProfiler.h | 5 ++-- api/logic/tools/JProfiler.cpp | 4 +-- api/logic/tools/JVisualVM.cpp | 4 +-- 19 files changed, 69 insertions(+), 73 deletions(-) (limited to 'api') diff --git a/api/gui/icons/IconList.h b/api/gui/icons/IconList.h index 2bacdac3..274a9f02 100644 --- a/api/gui/icons/IconList.h +++ b/api/gui/icons/IconList.h @@ -80,7 +80,7 @@ protected slots: void fileChanged(const QString &path); void SettingChanged(const Setting & setting, QVariant value); private: - std::shared_ptr m_watcher; + shared_qobject_ptr m_watcher; bool is_watching; QMap name_index; QVector icons; diff --git a/api/logic/BaseInstance.cpp b/api/logic/BaseInstance.cpp index 469d0d9f..7a95e255 100644 --- a/api/logic/BaseInstance.cpp +++ b/api/logic/BaseInstance.cpp @@ -175,11 +175,6 @@ QString BaseInstance::instanceRoot() const return m_rootDir; } -InstancePtr BaseInstance::getSharedPtr() -{ - return shared_from_this(); -} - SettingsObjectPtr BaseInstance::settings() const { return m_settings; @@ -253,7 +248,7 @@ QStringList BaseInstance::extraArguments() const return Commandline::splitArgs(settings()->get("JvmArgs").toString()); } -std::shared_ptr BaseInstance::getLaunchTask() +shared_qobject_ptr BaseInstance::getLaunchTask() { return m_launchProcess; } diff --git a/api/logic/BaseInstance.h b/api/logic/BaseInstance.h index 73500b1a..3c342cb3 100644 --- a/api/logic/BaseInstance.h +++ b/api/logic/BaseInstance.h @@ -134,8 +134,6 @@ public: /// Sets the last launched time to 'val' milliseconds since epoch void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch()); - InstancePtr getSharedPtr(); - /*! * \brief Gets this instance's settings object. * This settings object stores instance-specific settings. @@ -147,10 +145,10 @@ public: virtual shared_qobject_ptr createUpdateTask(Net::Mode mode) = 0; /// returns a valid launcher (task container) - virtual std::shared_ptr createLaunchTask(AuthSessionPtr account) = 0; + virtual shared_qobject_ptr createLaunchTask(AuthSessionPtr account) = 0; /// returns the current launch task (if any) - std::shared_ptr getLaunchTask(); + shared_qobject_ptr getLaunchTask(); /*! * Create envrironment variables for running the instance @@ -241,7 +239,7 @@ signals: */ void propertiesChanged(BaseInstance *inst); - void launchTaskChanged(std::shared_ptr); + void launchTaskChanged(shared_qobject_ptr); void runningStatusChanged(bool running); @@ -255,7 +253,7 @@ protected: /* data */ SettingsObjectPtr m_settings; // InstanceFlags m_flags; bool m_isRunning = false; - std::shared_ptr m_launchProcess; + shared_qobject_ptr m_launchProcess; QDateTime m_timeStarted; private: /* data */ @@ -265,6 +263,6 @@ private: /* data */ bool m_hasBrokenVersion = false; }; -Q_DECLARE_METATYPE(std::shared_ptr) +Q_DECLARE_METATYPE(shared_qobject_ptr) //Q_DECLARE_METATYPE(BaseInstance::InstanceFlag) //Q_DECLARE_OPERATORS_FOR_FLAGS(BaseInstance::InstanceFlags) diff --git a/api/logic/NullInstance.h b/api/logic/NullInstance.h index ff3551c5..e9ba1a13 100644 --- a/api/logic/NullInstance.h +++ b/api/logic/NullInstance.h @@ -1,5 +1,6 @@ #pragma once #include "BaseInstance.h" +#include "launch/LaunchTask.h" class NullInstance: public BaseInstance { @@ -11,46 +12,46 @@ public: setVersionBroken(true); } virtual ~NullInstance() {}; - virtual void saveNow() override + void saveNow() override { } - virtual QString getStatusbarDescription() override + QString getStatusbarDescription() override { return tr("Unknown instance type"); }; - virtual QSet< QString > traits() const override + QSet< QString > traits() const override { return {}; }; - virtual QString instanceConfigFolder() const override + QString instanceConfigFolder() const override { return instanceRoot(); }; - virtual std::shared_ptr createLaunchTask(AuthSessionPtr) override + shared_qobject_ptr createLaunchTask(AuthSessionPtr) override { return nullptr; } - virtual shared_qobject_ptr< Task > createUpdateTask(Net::Mode mode) override + shared_qobject_ptr< Task > createUpdateTask(Net::Mode mode) override { return nullptr; } - virtual QProcessEnvironment createEnvironment() override + QProcessEnvironment createEnvironment() override { return QProcessEnvironment(); } - virtual QMap getVariables() const override + QMap getVariables() const override { return QMap(); } - virtual IPathMatcher::Ptr getLogFileMatcher() override + IPathMatcher::Ptr getLogFileMatcher() override { return nullptr; } - virtual QString getLogFileRoot() override + QString getLogFileRoot() override { return instanceRoot(); } - virtual QString typeName() const override + QString typeName() const override { return "Null"; } diff --git a/api/logic/java/JavaChecker.cpp b/api/logic/java/JavaChecker.cpp index 9ba3933f..ca0f4bde 100644 --- a/api/logic/java/JavaChecker.cpp +++ b/api/logic/java/JavaChecker.cpp @@ -75,8 +75,8 @@ void JavaChecker::stderrReady() void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) { killTimer.stop(); - QProcessPtr _process; - _process.swap(process); + QProcessPtr _process = process; + process.reset(); JavaCheckResult result; { diff --git a/api/logic/java/JavaChecker.h b/api/logic/java/JavaChecker.h index d5d4b0de..af0dcb90 100644 --- a/api/logic/java/JavaChecker.h +++ b/api/logic/java/JavaChecker.h @@ -3,6 +3,8 @@ #include #include +#include "QObjectPtr.h" + #include "multimc_logic_export.h" #include "JavaVersion.h" @@ -27,8 +29,8 @@ struct MULTIMC_LOGIC_EXPORT JavaCheckResult } validity = Validity::Errored; }; -typedef std::shared_ptr QProcessPtr; -typedef std::shared_ptr JavaCheckerPtr; +typedef shared_qobject_ptr QProcessPtr; +typedef shared_qobject_ptr JavaCheckerPtr; class MULTIMC_LOGIC_EXPORT JavaChecker : public QObject { Q_OBJECT diff --git a/api/logic/java/JavaCheckerJob.h b/api/logic/java/JavaCheckerJob.h index ab8a4bbc..24d0d1b8 100644 --- a/api/logic/java/JavaCheckerJob.h +++ b/api/logic/java/JavaCheckerJob.h @@ -20,7 +20,7 @@ #include "tasks/Task.h" class JavaCheckerJob; -typedef std::shared_ptr JavaCheckerJobPtr; +typedef shared_qobject_ptr JavaCheckerJobPtr; // FIXME: this just seems horribly redundant class JavaCheckerJob : public Task diff --git a/api/logic/java/JavaInstallList.cpp b/api/logic/java/JavaInstallList.cpp index a80ee2da..a71a7dbe 100644 --- a/api/logic/java/JavaInstallList.cpp +++ b/api/logic/java/JavaInstallList.cpp @@ -149,7 +149,7 @@ void JavaListLoadTask::executeTask() JavaUtils ju; QList candidate_paths = ju.FindJavaPaths(); - m_job = std::shared_ptr(new JavaCheckerJob("Java detection")); + m_job = new JavaCheckerJob("Java detection"); connect(m_job.get(), &Task::finished, this, &JavaListLoadTask::javaCheckerFinished); connect(m_job.get(), &Task::progress, this, &Task::setProgress); diff --git a/api/logic/java/JavaInstallList.h b/api/logic/java/JavaInstallList.h index fc7e7a92..b98908f3 100644 --- a/api/logic/java/JavaInstallList.h +++ b/api/logic/java/JavaInstallList.h @@ -24,6 +24,8 @@ #include "JavaCheckerJob.h" #include "JavaInstall.h" +#include "QObjectPtr.h" + #include "multimc_logic_export.h" class JavaListLoadTask; @@ -75,7 +77,7 @@ public slots: void javaCheckerFinished(); protected: - std::shared_ptr m_job; + shared_qobject_ptr m_job; JavaInstallList *m_list; JavaInstall *m_currentRecommended; }; diff --git a/api/logic/java/launch/CheckJava.cpp b/api/logic/java/launch/CheckJava.cpp index f4c85245..b75c6dc6 100644 --- a/api/logic/java/launch/CheckJava.cpp +++ b/api/logic/java/launch/CheckJava.cpp @@ -60,7 +60,7 @@ void CheckJava::executeTask() // if timestamps are not the same, or something is missing, check! if (javaUnixTime != storedUnixTime || storedVersion.size() == 0 || storedArchitecture.size() == 0) { - m_JavaChecker = std::make_shared(); + m_JavaChecker = new JavaChecker(); emit logLine(tr("Checking Java version..."), MessageLevel::MultiMC); connect(m_JavaChecker.get(), &JavaChecker::checkFinished, this, &CheckJava::checkJavaFinished); m_JavaChecker->m_path = realJavaPath; diff --git a/api/logic/launch/LaunchTask.cpp b/api/logic/launch/LaunchTask.cpp index d39a9208..841b8363 100644 --- a/api/logic/launch/LaunchTask.cpp +++ b/api/logic/launch/LaunchTask.cpp @@ -33,9 +33,9 @@ void LaunchTask::init() m_instance->setRunning(true); } -std::shared_ptr LaunchTask::create(InstancePtr inst) +shared_qobject_ptr LaunchTask::create(InstancePtr inst) { - std::shared_ptr proc(new LaunchTask(inst)); + shared_qobject_ptr proc(new LaunchTask(inst)); proc->init(); return proc; } @@ -44,12 +44,12 @@ LaunchTask::LaunchTask(InstancePtr instance): m_instance(instance) { } -void LaunchTask::appendStep(std::shared_ptr step) +void LaunchTask::appendStep(shared_qobject_ptr step) { m_steps.append(step); } -void LaunchTask::prependStep(std::shared_ptr step) +void LaunchTask::prependStep(shared_qobject_ptr step) { m_steps.prepend(step); } diff --git a/api/logic/launch/LaunchTask.h b/api/logic/launch/LaunchTask.h index 4f6efe0a..ee04bd9a 100644 --- a/api/logic/launch/LaunchTask.h +++ b/api/logic/launch/LaunchTask.h @@ -45,11 +45,11 @@ public: }; public: /* methods */ - static std::shared_ptr create(InstancePtr inst); + static shared_qobject_ptr create(InstancePtr inst); virtual ~LaunchTask() {}; - void appendStep(std::shared_ptr step); - void prependStep(std::shared_ptr step); + void appendStep(shared_qobject_ptr step); + void prependStep(shared_qobject_ptr step); void setCensorFilter(QMap filter); InstancePtr instance() @@ -117,7 +117,7 @@ private: /*methods */ protected: /* data */ InstancePtr m_instance; shared_qobject_ptr m_logModel; - QList > m_steps; + QList > m_steps; QMap m_censorFilter; int currentStep = -1; State state = NotStarted; diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp index 449a2ed5..0d97e4af 100644 --- a/api/logic/minecraft/MinecraftInstance.cpp +++ b/api/logic/minecraft/MinecraftInstance.cpp @@ -777,22 +777,22 @@ shared_qobject_ptr MinecraftInstance::createUpdateTask(Net::Mode mode) return nullptr; } -std::shared_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr session) +shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr session) { - auto process = LaunchTask::create(std::dynamic_pointer_cast(getSharedPtr())); + // FIXME: get rid of shared_from_this ... + auto process = LaunchTask::create(std::dynamic_pointer_cast(shared_from_this())); auto pptr = process.get(); ENV.icons()->saveIcon(iconKey(), FS::PathCombine(gameRoot(), "icon.png"), "PNG"); // print a header { - process->appendStep(std::make_shared(pptr, "Minecraft folder is:\n" + gameRoot() + "\n\n", MessageLevel::MultiMC)); + process->appendStep(new TextPrint(pptr, "Minecraft folder is:\n" + gameRoot() + "\n\n", MessageLevel::MultiMC)); } // check java { - auto step = std::make_shared(pptr); - process->appendStep(step); + process->appendStep(new CheckJava(pptr)); } // check launch method @@ -800,14 +800,14 @@ std::shared_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr s QString method = launchMethod(); if(!validMethods.contains(method)) { - process->appendStep(std::make_shared(pptr, "Selected launch method \"" + method + "\" is not valid.\n", MessageLevel::Fatal)); + process->appendStep(new TextPrint(pptr, "Selected launch method \"" + method + "\" is not valid.\n", MessageLevel::Fatal)); return process; } // run pre-launch command if that's needed if(getPreLaunchCommand().size()) { - auto step = std::make_shared(pptr); + auto step = new PreLaunchCommand(pptr); step->setWorkingDirectory(gameRoot()); process->appendStep(step); } @@ -815,42 +815,37 @@ std::shared_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr s // if we aren't in offline mode,. if(session->status != AuthSession::PlayableOffline) { - process->appendStep(std::make_shared(pptr, session)); - process->appendStep(std::make_shared(pptr, Net::Mode::Online)); + process->appendStep(new ClaimAccount(pptr, session)); + process->appendStep(new Update(pptr, Net::Mode::Online)); } else { - process->appendStep(std::make_shared(pptr, Net::Mode::Offline)); + process->appendStep(new Update(pptr, Net::Mode::Offline)); } // if there are any jar mods { - auto step = std::make_shared(pptr); - process->appendStep(step); + process->appendStep(new ModMinecraftJar(pptr)); } // print some instance info here... { - auto step = std::make_shared(pptr, session); - process->appendStep(step); + process->appendStep(new PrintInstanceInfo(pptr, session)); } // create the server-resource-packs folder (workaround for Minecraft bug MCL-3732) { - auto step = std::make_shared(pptr); - process->appendStep(step); + process->appendStep(new CreateServerResourcePacksFolder(pptr)); } // extract native jars if needed { - auto step = std::make_shared(pptr); - process->appendStep(step); + process->appendStep(new ExtractNatives(pptr)); } // reconstruct assets if needed { - auto step = std::make_shared(pptr); - process->appendStep(step); + process->appendStep(new ReconstructAssets(pptr)); } { @@ -858,14 +853,14 @@ std::shared_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr s auto method = launchMethod(); if(method == "LauncherPart") { - auto step = std::make_shared(pptr); + auto step = new LauncherPartLaunch(pptr); step->setWorkingDirectory(gameRoot()); step->setAuthSession(session); process->appendStep(step); } else if (method == "DirectJava") { - auto step = std::make_shared(pptr); + auto step = new DirectJavaLaunch(pptr); step->setWorkingDirectory(gameRoot()); step->setAuthSession(session); process->appendStep(step); @@ -875,7 +870,7 @@ std::shared_ptr MinecraftInstance::createLaunchTask(AuthSessionPtr s // run post-exit command if that's needed if(getPostExitCommand().size()) { - auto step = std::make_shared(pptr); + auto step = new PostLaunchCommand(pptr); step->setWorkingDirectory(gameRoot()); process->appendStep(step); } diff --git a/api/logic/minecraft/MinecraftInstance.h b/api/logic/minecraft/MinecraftInstance.h index d9fffe57..fac309c2 100644 --- a/api/logic/minecraft/MinecraftInstance.h +++ b/api/logic/minecraft/MinecraftInstance.h @@ -78,7 +78,7 @@ public: ////// Launch stuff ////// shared_qobject_ptr createUpdateTask(Net::Mode mode) override; - std::shared_ptr createLaunchTask(AuthSessionPtr account) override; + shared_qobject_ptr createLaunchTask(AuthSessionPtr account) override; QStringList extraArguments() const override; QStringList verboseDescription(AuthSessionPtr session) override; QList getJarMods() const; diff --git a/api/logic/minecraft/legacy/LegacyInstance.h b/api/logic/minecraft/legacy/LegacyInstance.h index 56602a1e..8bbc2d88 100644 --- a/api/logic/minecraft/legacy/LegacyInstance.h +++ b/api/logic/minecraft/legacy/LegacyInstance.h @@ -17,6 +17,7 @@ #include "BaseInstance.h" #include "minecraft/Mod.h" +#include "launch/LaunchTask.h" #include "multimc_logic_export.h" @@ -112,7 +113,7 @@ public: { return false; } - std::shared_ptr createLaunchTask(AuthSessionPtr account) override + shared_qobject_ptr createLaunchTask(AuthSessionPtr account) override { return nullptr; } diff --git a/api/logic/tools/BaseProfiler.cpp b/api/logic/tools/BaseProfiler.cpp index c7d83549..300d1a73 100644 --- a/api/logic/tools/BaseProfiler.cpp +++ b/api/logic/tools/BaseProfiler.cpp @@ -1,4 +1,5 @@ #include "BaseProfiler.h" +#include "QObjectPtr.h" #include @@ -7,7 +8,7 @@ BaseProfiler::BaseProfiler(SettingsObjectPtr settings, InstancePtr instance, QOb { } -void BaseProfiler::beginProfiling(std::shared_ptr process) +void BaseProfiler::beginProfiling(shared_qobject_ptr process) { beginProfilingImpl(process); } diff --git a/api/logic/tools/BaseProfiler.h b/api/logic/tools/BaseProfiler.h index f3e1ce3d..da817f52 100644 --- a/api/logic/tools/BaseProfiler.h +++ b/api/logic/tools/BaseProfiler.h @@ -1,6 +1,7 @@ #pragma once #include "BaseExternalTool.h" +#include "QObjectPtr.h" #include "multimc_logic_export.h" @@ -17,13 +18,13 @@ public: public slots: - void beginProfiling(std::shared_ptr process); + void beginProfiling(shared_qobject_ptr process); void abortProfiling(); protected: QProcess *m_profilerProcess; - virtual void beginProfilingImpl(std::shared_ptr process) = 0; + virtual void beginProfilingImpl(shared_qobject_ptr process) = 0; virtual void abortProfilingImpl(); signals: diff --git a/api/logic/tools/JProfiler.cpp b/api/logic/tools/JProfiler.cpp index b50322fe..1dc0d109 100644 --- a/api/logic/tools/JProfiler.cpp +++ b/api/logic/tools/JProfiler.cpp @@ -17,7 +17,7 @@ private slots: void profilerFinished(int exit, QProcess::ExitStatus status); protected: - void beginProfilingImpl(std::shared_ptr process); + void beginProfilingImpl(shared_qobject_ptr process); private: int listeningPort = 0; @@ -47,7 +47,7 @@ void JProfiler::profilerFinished(int exit, QProcess::ExitStatus status) } } -void JProfiler::beginProfilingImpl(std::shared_ptr process) +void JProfiler::beginProfilingImpl(shared_qobject_ptr process) { listeningPort = globalSettings->get("JProfilerPort").toInt(); QProcess *profiler = new QProcess(this); diff --git a/api/logic/tools/JVisualVM.cpp b/api/logic/tools/JVisualVM.cpp index 10886857..b1acc3c0 100644 --- a/api/logic/tools/JVisualVM.cpp +++ b/api/logic/tools/JVisualVM.cpp @@ -18,7 +18,7 @@ private slots: void profilerFinished(int exit, QProcess::ExitStatus status); protected: - void beginProfilingImpl(std::shared_ptr process); + void beginProfilingImpl(shared_qobject_ptr process); }; @@ -45,7 +45,7 @@ void JVisualVM::profilerFinished(int exit, QProcess::ExitStatus status) } } -void JVisualVM::beginProfilingImpl(std::shared_ptr process) +void JVisualVM::beginProfilingImpl(shared_qobject_ptr process) { QProcess *profiler = new QProcess(this); QStringList profilerArgs = -- cgit v1.2.3