aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2022-09-16 19:25:53 -0300
committerflow <flowlnlnln@gmail.com>2022-09-16 20:12:30 -0300
commit10493bd44ab59171ac4f2e3ab7b600bcff8e4af6 (patch)
treeccce878c5564c02c8b20020cdefbc9e1aa169b85 /launcher/minecraft
parent9e35230467267691ce745429de8d7e0b18095084 (diff)
downloadPrismLauncher-10493bd44ab59171ac4f2e3ab7b600bcff8e4af6.tar.gz
PrismLauncher-10493bd44ab59171ac4f2e3ab7b600bcff8e4af6.tar.bz2
PrismLauncher-10493bd44ab59171ac4f2e3ab7b600bcff8e4af6.zip
fix: move newly allocated resources to the main thread
This avoids them getting deleted when the worker thread exits, due to thread affinity on the created thread. Signed-off-by: flow <flowlnlnln@gmail.com>
Diffstat (limited to 'launcher/minecraft')
-rw-r--r--launcher/minecraft/mod/tasks/BasicFolderLoadTask.h12
-rw-r--r--launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp16
-rw-r--r--launcher/minecraft/mod/tasks/ModFolderLoadTask.h3
3 files changed, 28 insertions, 3 deletions
diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h
index be0e752d..2fce2942 100644
--- a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h
+++ b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h
@@ -3,6 +3,7 @@
#include <QDir>
#include <QMap>
#include <QObject>
+#include <QThread>
#include <memory>
@@ -23,14 +24,14 @@ class BasicFolderLoadTask : public Task {
[[nodiscard]] ResultPtr result() const { return m_result; }
public:
- BasicFolderLoadTask(QDir dir) : Task(nullptr, false), m_dir(dir), m_result(new Result)
+ BasicFolderLoadTask(QDir dir) : Task(nullptr, false), m_dir(dir), m_result(new Result), m_thread_to_spawn_into(thread())
{
m_create_func = [](QFileInfo const& entry) -> Resource* {
return new Resource(entry);
};
}
BasicFolderLoadTask(QDir dir, std::function<Resource*(QFileInfo const&)> create_function)
- : Task(nullptr, false), m_dir(dir), m_result(new Result), m_create_func(std::move(create_function))
+ : Task(nullptr, false), m_dir(dir), m_result(new Result), m_create_func(std::move(create_function)), m_thread_to_spawn_into(thread())
{}
[[nodiscard]] bool canAbort() const override { return true; }
@@ -42,9 +43,13 @@ class BasicFolderLoadTask : public Task {
void executeTask() override
{
+ if (thread() != m_thread_to_spawn_into)
+ connect(this, &Task::finished, this->thread(), &QThread::quit);
+
m_dir.refresh();
for (auto entry : m_dir.entryInfoList()) {
auto resource = m_create_func(entry);
+ resource->moveToThread(m_thread_to_spawn_into);
m_result->resources.insert(resource->internal_id(), resource);
}
@@ -61,4 +66,7 @@ private:
std::atomic<bool> m_aborted = false;
std::function<Resource*(QFileInfo const&)> m_create_func;
+
+ /** This is the thread in which we should put new mod objects */
+ QThread* m_thread_to_spawn_into;
};
diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
index afe892f4..40a6ba18 100644
--- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
+++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
@@ -38,12 +38,23 @@
#include "minecraft/mod/MetadataHandler.h"
+#include <QThread>
+
ModFolderLoadTask::ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan)
- : Task(nullptr, false), m_mods_dir(mods_dir), m_index_dir(index_dir), m_is_indexed(is_indexed), m_clean_orphan(clean_orphan), m_result(new Result())
+ : Task(nullptr, false)
+ , m_mods_dir(mods_dir)
+ , m_index_dir(index_dir)
+ , m_is_indexed(is_indexed)
+ , m_clean_orphan(clean_orphan)
+ , m_result(new Result())
+ , m_thread_to_spawn_into(thread())
{}
void ModFolderLoadTask::executeTask()
{
+ if (thread() != m_thread_to_spawn_into)
+ connect(this, &Task::finished, this->thread(), &QThread::quit);
+
if (m_is_indexed) {
// Read metadata first
getFromMetadata();
@@ -98,6 +109,9 @@ void ModFolderLoadTask::executeTask()
}
}
+ for (auto mod : m_result->mods)
+ mod->moveToThread(m_thread_to_spawn_into);
+
if (m_aborted)
emit finished();
else
diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
index 0f18b8b9..af5f58a5 100644
--- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
+++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
@@ -79,4 +79,7 @@ private:
ResultPtr m_result;
std::atomic<bool> m_aborted = false;
+
+ /** This is the thread in which we should put new mod objects */
+ QThread* m_thread_to_spawn_into;
};