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>
This commit is contained in:
parent
9e35230467
commit
10493bd44a
@ -3,6 +3,7 @@
|
|||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@ -23,14 +24,14 @@ class BasicFolderLoadTask : public Task {
|
|||||||
[[nodiscard]] ResultPtr result() const { return m_result; }
|
[[nodiscard]] ResultPtr result() const { return m_result; }
|
||||||
|
|
||||||
public:
|
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* {
|
m_create_func = [](QFileInfo const& entry) -> Resource* {
|
||||||
return new Resource(entry);
|
return new Resource(entry);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
BasicFolderLoadTask(QDir dir, std::function<Resource*(QFileInfo const&)> create_function)
|
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; }
|
[[nodiscard]] bool canAbort() const override { return true; }
|
||||||
@ -42,9 +43,13 @@ class BasicFolderLoadTask : public Task {
|
|||||||
|
|
||||||
void executeTask() override
|
void executeTask() override
|
||||||
{
|
{
|
||||||
|
if (thread() != m_thread_to_spawn_into)
|
||||||
|
connect(this, &Task::finished, this->thread(), &QThread::quit);
|
||||||
|
|
||||||
m_dir.refresh();
|
m_dir.refresh();
|
||||||
for (auto entry : m_dir.entryInfoList()) {
|
for (auto entry : m_dir.entryInfoList()) {
|
||||||
auto resource = m_create_func(entry);
|
auto resource = m_create_func(entry);
|
||||||
|
resource->moveToThread(m_thread_to_spawn_into);
|
||||||
m_result->resources.insert(resource->internal_id(), resource);
|
m_result->resources.insert(resource->internal_id(), resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,4 +66,7 @@ private:
|
|||||||
std::atomic<bool> m_aborted = false;
|
std::atomic<bool> m_aborted = false;
|
||||||
|
|
||||||
std::function<Resource*(QFileInfo const&)> m_create_func;
|
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;
|
||||||
};
|
};
|
||||||
|
@ -38,12 +38,23 @@
|
|||||||
|
|
||||||
#include "minecraft/mod/MetadataHandler.h"
|
#include "minecraft/mod/MetadataHandler.h"
|
||||||
|
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
ModFolderLoadTask::ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan)
|
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()
|
void ModFolderLoadTask::executeTask()
|
||||||
{
|
{
|
||||||
|
if (thread() != m_thread_to_spawn_into)
|
||||||
|
connect(this, &Task::finished, this->thread(), &QThread::quit);
|
||||||
|
|
||||||
if (m_is_indexed) {
|
if (m_is_indexed) {
|
||||||
// Read metadata first
|
// Read metadata first
|
||||||
getFromMetadata();
|
getFromMetadata();
|
||||||
@ -98,6 +109,9 @@ void ModFolderLoadTask::executeTask()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto mod : m_result->mods)
|
||||||
|
mod->moveToThread(m_thread_to_spawn_into);
|
||||||
|
|
||||||
if (m_aborted)
|
if (m_aborted)
|
||||||
emit finished();
|
emit finished();
|
||||||
else
|
else
|
||||||
|
@ -79,4 +79,7 @@ private:
|
|||||||
ResultPtr m_result;
|
ResultPtr m_result;
|
||||||
|
|
||||||
std::atomic<bool> m_aborted = false;
|
std::atomic<bool> m_aborted = false;
|
||||||
|
|
||||||
|
/** This is the thread in which we should put new mod objects */
|
||||||
|
QThread* m_thread_to_spawn_into;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user