summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiretza2019-06-11 14:38:07 +0200
committerXiretza2019-06-11 14:39:28 +0200
commit9815dd3f86425b96507d36a3335a43a7ff82dfb5 (patch)
treeace8e803b0b0b491007727510c7e986c10d3030b
parent805eff02b12c02b034a260746fed63be81dc04c3 (diff)
downloadaur-9815dd3f86425b96507d36a3335a43a7ff82dfb5.tar.gz
Fix crash on launching instance
-rw-r--r--.SRCINFO4
-rwxr-xr-xPKGBUILD8
-rw-r--r--fix_shared_ptr_crashes.patch709
3 files changed, 718 insertions, 3 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 4295c21bc7c8..ed5446544139 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = multimc5
pkgdesc = Minecraft launcher with ability to manage multiple instances.
pkgver = 0.6.5
- pkgrel = 1
+ pkgrel = 2
url = http://multimc.org/
arch = i686
arch = x86_64
@@ -22,10 +22,12 @@ pkgbase = multimc5
source = https://github.com/MultiMC/libnbtplusplus/archive/multimc-0.6.1.tar.gz
source = https://github.com/MultiMC/quazip/archive/multimc-3.tar.gz
source = quazip-fix-build-with-qt-511.patch
+ source = fix_shared_ptr_crashes.patch
sha512sums = 472c676223c180e176e1430d880cc7449118c7af501bb5354286158151b513b0b510c9c5ba1f4cf5e49ea46863b582dbf8ade84e1ec6b7716b297cbec9582082
sha512sums = 81a1640a069d88df7ba0abf72089aecbe1e9d791c88acaaa7e70c8f0bcd0512cf8698178342657e363524ce8488dd072368a0aa8cc091a24912d6f8b6b0f4f2d
sha512sums = 2e9074203c67bc7ad98621c551047e5367f06e54cacfecc755a5bf2c9f99266eab42ad972f86ae28ed7e1507f6d27d8d2680a87ce9fd5b1e93a18bcb627ec3f0
sha512sums = ca7a350bdeecf65dbca7de8d6912c935c6ba603edcddcd4ffe71d8997e50e4046335dde6d1d7c629d35025073d18be4d112a960d43a8801de979687bc26e46d4
+ sha512sums = 3fde1fcac58e4ba80871443af7e8a7664e3973d1f6b1bf4bfe96fdbc64e75f624023d4938e03f32a44af9468af52aa58e1f61de5a13324254600ab869e417fa1
pkgname = multimc5
diff --git a/PKGBUILD b/PKGBUILD
index b733ea3b84a1..9da2097aff54 100755
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -4,7 +4,7 @@
pkgname=multimc5
pkgver=0.6.5
-pkgrel=1
+pkgrel=2
__pkgver_libnbtplusplus=multimc-0.6.1
__pkgver_quazip=multimc-3
pkgdesc="Minecraft launcher with ability to manage multiple instances."
@@ -21,11 +21,13 @@ source=("https://github.com/MultiMC/MultiMC5/archive/${pkgver}.tar.gz"
"https://github.com/MultiMC/libnbtplusplus/archive/${__pkgver_libnbtplusplus}.tar.gz"
"https://github.com/MultiMC/quazip/archive/${__pkgver_quazip}.tar.gz"
"quazip-fix-build-with-qt-511.patch"
+ "fix_shared_ptr_crashes.patch"
)
sha512sums=('472c676223c180e176e1430d880cc7449118c7af501bb5354286158151b513b0b510c9c5ba1f4cf5e49ea46863b582dbf8ade84e1ec6b7716b297cbec9582082'
'81a1640a069d88df7ba0abf72089aecbe1e9d791c88acaaa7e70c8f0bcd0512cf8698178342657e363524ce8488dd072368a0aa8cc091a24912d6f8b6b0f4f2d'
'2e9074203c67bc7ad98621c551047e5367f06e54cacfecc755a5bf2c9f99266eab42ad972f86ae28ed7e1507f6d27d8d2680a87ce9fd5b1e93a18bcb627ec3f0'
- 'ca7a350bdeecf65dbca7de8d6912c935c6ba603edcddcd4ffe71d8997e50e4046335dde6d1d7c629d35025073d18be4d112a960d43a8801de979687bc26e46d4')
+ 'ca7a350bdeecf65dbca7de8d6912c935c6ba603edcddcd4ffe71d8997e50e4046335dde6d1d7c629d35025073d18be4d112a960d43a8801de979687bc26e46d4'
+ '3fde1fcac58e4ba80871443af7e8a7664e3973d1f6b1bf4bfe96fdbc64e75f624023d4938e03f32a44af9468af52aa58e1f61de5a13324254600ab869e417fa1')
prepare() {
cd "${srcdir}/MultiMC5-${pkgver}"
@@ -36,6 +38,8 @@ prepare() {
cp --recursive "${srcdir}/quazip-${__pkgver_quazip}/" \
"libraries/quazip"
+ patch -p1 < "${srcdir}/fix_shared_ptr_crashes.patch"
+
cd "libraries/quazip"
# https://github.com/MultiMC/quazip/pull/1
patch -p1 < "${srcdir}/quazip-fix-build-with-qt-511.patch"
diff --git a/fix_shared_ptr_crashes.patch b/fix_shared_ptr_crashes.patch
new file mode 100644
index 000000000000..55dc9a389d09
--- /dev/null
+++ b/fix_shared_ptr_crashes.patch
@@ -0,0 +1,709 @@
+From 70ed30f9e6b47fbfb3151078ca61a2bb419feccb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= <peterix@gmail.com>
+Date: Sun, 7 Apr 2019 23:59:04 +0200
+Subject: [PATCH] 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 +-
+ application/InstanceWindow.cpp | 2 +-
+ application/InstanceWindow.h | 4 +-
+ application/LaunchController.cpp | 2 +-
+ application/LaunchController.h | 2 +-
+ application/pages/instance/LogPage.cpp | 4 +-
+ application/pages/instance/LogPage.h | 6 +--
+ 25 files changed, 79 insertions(+), 83 deletions(-)
+
+diff --git a/api/gui/icons/IconList.h b/api/gui/icons/IconList.h
+index 2bacdac3b..274a9f022 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<QFileSystemWatcher> m_watcher;
++ shared_qobject_ptr<QFileSystemWatcher> m_watcher;
+ bool is_watching;
+ QMap<QString, int> name_index;
+ QVector<MMCIcon> icons;
+diff --git a/api/logic/BaseInstance.cpp b/api/logic/BaseInstance.cpp
+index 469d0d9ff..7a95e2559 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<LaunchTask> BaseInstance::getLaunchTask()
++shared_qobject_ptr<LaunchTask> BaseInstance::getLaunchTask()
+ {
+ return m_launchProcess;
+ }
+diff --git a/api/logic/BaseInstance.h b/api/logic/BaseInstance.h
+index 73500b1a9..3c342cb3f 100644
+--- a/api/logic/BaseInstance.h
++++ b/api/logic/BaseInstance.h
+@@ -134,8 +134,6 @@ class MULTIMC_LOGIC_EXPORT BaseInstance : public QObject, public std::enable_sha
+ /// 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 @@ class MULTIMC_LOGIC_EXPORT BaseInstance : public QObject, public std::enable_sha
+ virtual shared_qobject_ptr<Task> createUpdateTask(Net::Mode mode) = 0;
+
+ /// returns a valid launcher (task container)
+- virtual std::shared_ptr<LaunchTask> createLaunchTask(AuthSessionPtr account) = 0;
++ virtual shared_qobject_ptr<LaunchTask> createLaunchTask(AuthSessionPtr account) = 0;
+
+ /// returns the current launch task (if any)
+- std::shared_ptr<LaunchTask> getLaunchTask();
++ shared_qobject_ptr<LaunchTask> getLaunchTask();
+
+ /*!
+ * Create envrironment variables for running the instance
+@@ -241,7 +239,7 @@ class MULTIMC_LOGIC_EXPORT BaseInstance : public QObject, public std::enable_sha
+ */
+ void propertiesChanged(BaseInstance *inst);
+
+- void launchTaskChanged(std::shared_ptr<LaunchTask>);
++ void launchTaskChanged(shared_qobject_ptr<LaunchTask>);
+
+ void runningStatusChanged(bool running);
+
+@@ -255,7 +253,7 @@ protected slots:
+ SettingsObjectPtr m_settings;
+ // InstanceFlags m_flags;
+ bool m_isRunning = false;
+- std::shared_ptr<LaunchTask> m_launchProcess;
++ shared_qobject_ptr<LaunchTask> m_launchProcess;
+ QDateTime m_timeStarted;
+
+ private: /* data */
+@@ -265,6 +263,6 @@ protected slots:
+ bool m_hasBrokenVersion = false;
+ };
+
+-Q_DECLARE_METATYPE(std::shared_ptr<BaseInstance>)
++Q_DECLARE_METATYPE(shared_qobject_ptr<BaseInstance>)
+ //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 ff3551c5f..e9ba1a13c 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 @@ class NullInstance: public BaseInstance
+ 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<LaunchTask> createLaunchTask(AuthSessionPtr) override
++ shared_qobject_ptr<LaunchTask> 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<QString, QString> getVariables() const override
++ QMap<QString, QString> getVariables() const override
+ {
+ return QMap<QString, QString>();
+ }
+- 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 9ba3933f2..ca0f4bde7 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 d5d4b0de6..af0dcb90c 100644
+--- a/api/logic/java/JavaChecker.h
++++ b/api/logic/java/JavaChecker.h
+@@ -3,6 +3,8 @@
+ #include <QTimer>
+ #include <memory>
+
++#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<QProcess> QProcessPtr;
+-typedef std::shared_ptr<JavaChecker> JavaCheckerPtr;
++typedef shared_qobject_ptr<QProcess> QProcessPtr;
++typedef shared_qobject_ptr<JavaChecker> 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 ab8a4bbcd..24d0d1b8f 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<JavaCheckerJob> JavaCheckerJobPtr;
++typedef shared_qobject_ptr<JavaCheckerJob> 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 a80ee2dac..a71a7dbea 100644
+--- a/api/logic/java/JavaInstallList.cpp
++++ b/api/logic/java/JavaInstallList.cpp
+@@ -149,7 +149,7 @@ void JavaListLoadTask::executeTask()
+ JavaUtils ju;
+ QList<QString> candidate_paths = ju.FindJavaPaths();
+
+- m_job = std::shared_ptr<JavaCheckerJob>(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 fc7e7a921..b98908f38 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<JavaCheckerJob> m_job;
++ shared_qobject_ptr<JavaCheckerJob> 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 f4c852456..b75c6dc62 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<JavaChecker>();
++ 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 d39a92083..841b83633 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> LaunchTask::create(InstancePtr inst)
++shared_qobject_ptr<LaunchTask> LaunchTask::create(InstancePtr inst)
+ {
+- std::shared_ptr<LaunchTask> proc(new LaunchTask(inst));
++ shared_qobject_ptr<LaunchTask> 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<LaunchStep> step)
++void LaunchTask::appendStep(shared_qobject_ptr<LaunchStep> step)
+ {
+ m_steps.append(step);
+ }
+
+-void LaunchTask::prependStep(std::shared_ptr<LaunchStep> step)
++void LaunchTask::prependStep(shared_qobject_ptr<LaunchStep> step)
+ {
+ m_steps.prepend(step);
+ }
+diff --git a/api/logic/launch/LaunchTask.h b/api/logic/launch/LaunchTask.h
+index 4f6efe0a1..ee04bd9af 100644
+--- a/api/logic/launch/LaunchTask.h
++++ b/api/logic/launch/LaunchTask.h
+@@ -45,11 +45,11 @@ class MULTIMC_LOGIC_EXPORT LaunchTask: public Task
+ };
+
+ public: /* methods */
+- static std::shared_ptr<LaunchTask> create(InstancePtr inst);
++ static shared_qobject_ptr<LaunchTask> create(InstancePtr inst);
+ virtual ~LaunchTask() {};
+
+- void appendStep(std::shared_ptr<LaunchStep> step);
+- void prependStep(std::shared_ptr<LaunchStep> step);
++ void appendStep(shared_qobject_ptr<LaunchStep> step);
++ void prependStep(shared_qobject_ptr<LaunchStep> step);
+ void setCensorFilter(QMap<QString, QString> filter);
+
+ InstancePtr instance()
+@@ -117,7 +117,7 @@ public slots:
+ protected: /* data */
+ InstancePtr m_instance;
+ shared_qobject_ptr<LogModel> m_logModel;
+- QList <std::shared_ptr<LaunchStep>> m_steps;
++ QList <shared_qobject_ptr<LaunchStep>> m_steps;
+ QMap<QString, QString> m_censorFilter;
+ int currentStep = -1;
+ State state = NotStarted;
+diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp
+index 449a2ed5b..0d97e4aff 100644
+--- a/api/logic/minecraft/MinecraftInstance.cpp
++++ b/api/logic/minecraft/MinecraftInstance.cpp
+@@ -777,22 +777,22 @@ shared_qobject_ptr<Task> MinecraftInstance::createUpdateTask(Net::Mode mode)
+ return nullptr;
+ }
+
+-std::shared_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPtr session)
++shared_qobject_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPtr session)
+ {
+- auto process = LaunchTask::create(std::dynamic_pointer_cast<MinecraftInstance>(getSharedPtr()));
++ // FIXME: get rid of shared_from_this ...
++ auto process = LaunchTask::create(std::dynamic_pointer_cast<MinecraftInstance>(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<TextPrint>(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<CheckJava>(pptr);
+- process->appendStep(step);
++ process->appendStep(new CheckJava(pptr));
+ }
+
+ // check launch method
+@@ -800,14 +800,14 @@ std::shared_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPtr s
+ QString method = launchMethod();
+ if(!validMethods.contains(method))
+ {
+- process->appendStep(std::make_shared<TextPrint>(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<PreLaunchCommand>(pptr);
++ auto step = new PreLaunchCommand(pptr);
+ step->setWorkingDirectory(gameRoot());
+ process->appendStep(step);
+ }
+@@ -815,42 +815,37 @@ std::shared_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPtr s
+ // if we aren't in offline mode,.
+ if(session->status != AuthSession::PlayableOffline)
+ {
+- process->appendStep(std::make_shared<ClaimAccount>(pptr, session));
+- process->appendStep(std::make_shared<Update>(pptr, Net::Mode::Online));
++ process->appendStep(new ClaimAccount(pptr, session));
++ process->appendStep(new Update(pptr, Net::Mode::Online));
+ }
+ else
+ {
+- process->appendStep(std::make_shared<Update>(pptr, Net::Mode::Offline));
++ process->appendStep(new Update(pptr, Net::Mode::Offline));
+ }
+
+ // if there are any jar mods
+ {
+- auto step = std::make_shared<ModMinecraftJar>(pptr);
+- process->appendStep(step);
++ process->appendStep(new ModMinecraftJar(pptr));
+ }
+
+ // print some instance info here...
+ {
+- auto step = std::make_shared<PrintInstanceInfo>(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<CreateServerResourcePacksFolder>(pptr);
+- process->appendStep(step);
++ process->appendStep(new CreateServerResourcePacksFolder(pptr));
+ }
+
+ // extract native jars if needed
+ {
+- auto step = std::make_shared<ExtractNatives>(pptr);
+- process->appendStep(step);
++ process->appendStep(new ExtractNatives(pptr));
+ }
+
+ // reconstruct assets if needed
+ {
+- auto step = std::make_shared<ReconstructAssets>(pptr);
+- process->appendStep(step);
++ process->appendStep(new ReconstructAssets(pptr));
+ }
+
+ {
+@@ -858,14 +853,14 @@ std::shared_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPtr s
+ auto method = launchMethod();
+ if(method == "LauncherPart")
+ {
+- auto step = std::make_shared<LauncherPartLaunch>(pptr);
++ auto step = new LauncherPartLaunch(pptr);
+ step->setWorkingDirectory(gameRoot());
+ step->setAuthSession(session);
+ process->appendStep(step);
+ }
+ else if (method == "DirectJava")
+ {
+- auto step = std::make_shared<DirectJavaLaunch>(pptr);
++ auto step = new DirectJavaLaunch(pptr);
+ step->setWorkingDirectory(gameRoot());
+ step->setAuthSession(session);
+ process->appendStep(step);
+@@ -875,7 +870,7 @@ std::shared_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPtr s
+ // run post-exit command if that's needed
+ if(getPostExitCommand().size())
+ {
+- auto step = std::make_shared<PostLaunchCommand>(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 d9fffe576..fac309c25 100644
+--- a/api/logic/minecraft/MinecraftInstance.h
++++ b/api/logic/minecraft/MinecraftInstance.h
+@@ -78,7 +78,7 @@ class MULTIMC_LOGIC_EXPORT MinecraftInstance: public BaseInstance
+
+ ////// Launch stuff //////
+ shared_qobject_ptr<Task> createUpdateTask(Net::Mode mode) override;
+- std::shared_ptr<LaunchTask> createLaunchTask(AuthSessionPtr account) override;
++ shared_qobject_ptr<LaunchTask> createLaunchTask(AuthSessionPtr account) override;
+ QStringList extraArguments() const override;
+ QStringList verboseDescription(AuthSessionPtr session) override;
+ QList<Mod> getJarMods() const;
+diff --git a/api/logic/minecraft/legacy/LegacyInstance.h b/api/logic/minecraft/legacy/LegacyInstance.h
+index 56602a1e5..8bbc2d887 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 @@ class MULTIMC_LOGIC_EXPORT LegacyInstance : public BaseInstance
+ {
+ return false;
+ }
+- std::shared_ptr<LaunchTask> createLaunchTask(AuthSessionPtr account) override
++ shared_qobject_ptr<LaunchTask> createLaunchTask(AuthSessionPtr account) override
+ {
+ return nullptr;
+ }
+diff --git a/api/logic/tools/BaseProfiler.cpp b/api/logic/tools/BaseProfiler.cpp
+index c7d83549d..300d1a736 100644
+--- a/api/logic/tools/BaseProfiler.cpp
++++ b/api/logic/tools/BaseProfiler.cpp
+@@ -1,4 +1,5 @@
+ #include "BaseProfiler.h"
++#include "QObjectPtr.h"
+
+ #include <QProcess>
+
+@@ -7,7 +8,7 @@ BaseProfiler::BaseProfiler(SettingsObjectPtr settings, InstancePtr instance, QOb
+ {
+ }
+
+-void BaseProfiler::beginProfiling(std::shared_ptr<LaunchTask> process)
++void BaseProfiler::beginProfiling(shared_qobject_ptr<LaunchTask> process)
+ {
+ beginProfilingImpl(process);
+ }
+diff --git a/api/logic/tools/BaseProfiler.h b/api/logic/tools/BaseProfiler.h
+index f3e1ce3d9..da817f523 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 @@ class MULTIMC_LOGIC_EXPORT BaseProfiler : public BaseExternalTool
+
+ public
+ slots:
+- void beginProfiling(std::shared_ptr<LaunchTask> process);
++ void beginProfiling(shared_qobject_ptr<LaunchTask> process);
+ void abortProfiling();
+
+ protected:
+ QProcess *m_profilerProcess;
+
+- virtual void beginProfilingImpl(std::shared_ptr<LaunchTask> process) = 0;
++ virtual void beginProfilingImpl(shared_qobject_ptr<LaunchTask> process) = 0;
+ virtual void abortProfilingImpl();
+
+ signals:
+diff --git a/api/logic/tools/JProfiler.cpp b/api/logic/tools/JProfiler.cpp
+index b50322fe9..1dc0d109f 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<LaunchTask> process);
++ void beginProfilingImpl(shared_qobject_ptr<LaunchTask> process);
+
+ private:
+ int listeningPort = 0;
+@@ -47,7 +47,7 @@ void JProfiler::profilerFinished(int exit, QProcess::ExitStatus status)
+ }
+ }
+
+-void JProfiler::beginProfilingImpl(std::shared_ptr<LaunchTask> process)
++void JProfiler::beginProfilingImpl(shared_qobject_ptr<LaunchTask> 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 108868570..b1acc3c0a 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<LaunchTask> process);
++ void beginProfilingImpl(shared_qobject_ptr<LaunchTask> process);
+ };
+
+
+@@ -45,7 +45,7 @@ void JVisualVM::profilerFinished(int exit, QProcess::ExitStatus status)
+ }
+ }
+
+-void JVisualVM::beginProfilingImpl(std::shared_ptr<LaunchTask> process)
++void JVisualVM::beginProfilingImpl(shared_qobject_ptr<LaunchTask> process)
+ {
+ QProcess *profiler = new QProcess(this);
+ QStringList profilerArgs =
+diff --git a/application/InstanceWindow.cpp b/application/InstanceWindow.cpp
+index 8a9c3bdf4..cf445f121 100644
+--- a/application/InstanceWindow.cpp
++++ b/application/InstanceWindow.cpp
+@@ -144,7 +144,7 @@ void InstanceWindow::on_btnLaunchMinecraftOffline_clicked()
+ MMC->launch(m_instance, false, nullptr);
+ }
+
+-void InstanceWindow::on_InstanceLaunchTask_changed(std::shared_ptr<LaunchTask> proc)
++void InstanceWindow::on_InstanceLaunchTask_changed(shared_qobject_ptr<LaunchTask> proc)
+ {
+ m_proc = proc;
+ }
+diff --git a/application/InstanceWindow.h b/application/InstanceWindow.h
+index 792624e2c..e5bd4464f 100644
+--- a/application/InstanceWindow.h
++++ b/application/InstanceWindow.h
+@@ -52,7 +52,7 @@ private
+ void on_btnKillMinecraft_clicked();
+ void on_btnLaunchMinecraftOffline_clicked();
+
+- void on_InstanceLaunchTask_changed(std::shared_ptr<LaunchTask> proc);
++ void on_InstanceLaunchTask_changed(shared_qobject_ptr<LaunchTask> proc);
+ void on_RunningState_changed(bool running);
+ void on_instanceStatusChanged(BaseInstance::Status, BaseInstance::Status newStatus);
+
+@@ -63,7 +63,7 @@ private
+ void updateLaunchButtons();
+
+ private:
+- std::shared_ptr<LaunchTask> m_proc;
++ shared_qobject_ptr<LaunchTask> m_proc;
+ InstancePtr m_instance;
+ bool m_doNotSave = false;
+ PageContainer *m_container = nullptr;
+diff --git a/application/LaunchController.cpp b/application/LaunchController.cpp
+index 0115bba46..8f3e6596f 100644
+--- a/application/LaunchController.cpp
++++ b/application/LaunchController.cpp
+@@ -218,7 +218,7 @@ void LaunchController::launchInstance()
+ connect(m_launcher.get(), &LaunchTask::requestProgress, this, &LaunchController::onProgressRequested);
+
+
+- m_launcher->prependStep(std::make_shared<TextPrint>(m_launcher.get(), "MultiMC version: " + BuildConfig.printableVersionString() + "\n\n", MessageLevel::MultiMC));
++ m_launcher->prependStep(new TextPrint(m_launcher.get(), "MultiMC version: " + BuildConfig.printableVersionString() + "\n\n", MessageLevel::MultiMC));
+ m_launcher->start();
+ }
+
+diff --git a/application/LaunchController.h b/application/LaunchController.h
+index 1434dec9b..1d879028d 100644
+--- a/application/LaunchController.h
++++ b/application/LaunchController.h
+@@ -57,5 +57,5 @@ private slots:
+ QWidget * m_parentWidget = nullptr;
+ InstanceWindow *m_console = nullptr;
+ AuthSessionPtr m_session;
+- std::shared_ptr <LaunchTask> m_launcher;
++ shared_qobject_ptr<LaunchTask> m_launcher;
+ };
+diff --git a/application/pages/instance/LogPage.cpp b/application/pages/instance/LogPage.cpp
+index 0e480a3a6..94ada4248 100644
+--- a/application/pages/instance/LogPage.cpp
++++ b/application/pages/instance/LogPage.cpp
+@@ -192,7 +192,7 @@ void LogPage::UIToModelState()
+ m_model->suspend(ui->trackLogCheckbox->checkState() != Qt::Checked);
+ }
+
+-void LogPage::setInstanceLaunchTaskChanged(std::shared_ptr<LaunchTask> proc, bool initial)
++void LogPage::setInstanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc, bool initial)
+ {
+ m_process = proc;
+ if(m_process)
+@@ -215,7 +215,7 @@ void LogPage::setInstanceLaunchTaskChanged(std::shared_ptr<LaunchTask> proc, boo
+ }
+ }
+
+-void LogPage::onInstanceLaunchTaskChanged(std::shared_ptr<LaunchTask> proc)
++void LogPage::onInstanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc)
+ {
+ setInstanceLaunchTaskChanged(proc, false);
+ }
+diff --git a/application/pages/instance/LogPage.h b/application/pages/instance/LogPage.h
+index 34ed210a0..9c3b56a9a 100644
+--- a/application/pages/instance/LogPage.h
++++ b/application/pages/instance/LogPage.h
+@@ -69,17 +69,17 @@ private slots:
+ void findNextActivated();
+ void findPreviousActivated();
+
+- void onInstanceLaunchTaskChanged(std::shared_ptr<LaunchTask> proc);
++ void onInstanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc);
+
+ private:
+ void modelStateToUI();
+ void UIToModelState();
+- void setInstanceLaunchTaskChanged(std::shared_ptr<LaunchTask> proc, bool initial);
++ void setInstanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc, bool initial);
+
+ private:
+ Ui::LogPage *ui;
+ InstancePtr m_instance;
+- std::shared_ptr<LaunchTask> m_process;
++ shared_qobject_ptr<LaunchTask> m_process;
+
+ LogFormatProxyModel * m_proxy;
+ shared_qobject_ptr <LogModel> m_model;