diff options
author | flow <flowlnlnln@gmail.com> | 2022-09-03 13:25:05 -0300 |
---|---|---|
committer | flow <flowlnlnln@gmail.com> | 2022-09-03 13:37:22 -0300 |
commit | 42c81395b362b9a080dca3f9d62e33c547cb8259 (patch) | |
tree | d4917be6579ed036e21489debfd22e6da50f9ee4 /launcher/minecraft/mod/tasks | |
parent | 3b13e692d29c96f99b2c153dd2c7933070eb8479 (diff) | |
download | PrismLauncher-42c81395b362b9a080dca3f9d62e33c547cb8259.tar.gz PrismLauncher-42c81395b362b9a080dca3f9d62e33c547cb8259.tar.bz2 PrismLauncher-42c81395b362b9a080dca3f9d62e33c547cb8259.zip |
fix: race condition on ResourceFolderModel tests
This (hopefully) fixes the race contiditions that sometimes got
triggered in tests.
Signed-off-by: flow <flowlnlnln@gmail.com>
Diffstat (limited to 'launcher/minecraft/mod/tasks')
5 files changed, 23 insertions, 10 deletions
diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h index 7ea512b3..be0e752d 100644 --- a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h +++ b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h @@ -36,7 +36,7 @@ class BasicFolderLoadTask : public Task { [[nodiscard]] bool canAbort() const override { return true; } bool abort() override { - m_aborted = true; + m_aborted.store(true); return true; } @@ -49,7 +49,7 @@ class BasicFolderLoadTask : public Task { } if (m_aborted) - emitAborted(); + emit finished(); else emitSucceeded(); } @@ -58,7 +58,7 @@ private: QDir m_dir; ResultPtr m_result; - bool m_aborted = false; + std::atomic<bool> m_aborted = false; std::function<Resource*(QFileInfo const&)> m_create_func; }; diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index c486bd46..8a6e54d8 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -499,7 +499,7 @@ void LocalModParseTask::processAsLitemod() bool LocalModParseTask::abort() { - m_aborted = true; + m_aborted.store(true); return true; } @@ -521,7 +521,7 @@ void LocalModParseTask::executeTask() } if (m_aborted) - emitAborted(); + emit finished(); else emitSucceeded(); } diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.h b/launcher/minecraft/mod/tasks/LocalModParseTask.h index 4bbf3c85..413eb2d1 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.h +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.h @@ -39,5 +39,5 @@ private: QFileInfo m_modFile; ResultPtr m_result; - bool m_aborted = false; + std::atomic<bool> m_aborted = false; }; diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp index a56ba8ab..3a857740 100644 --- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp +++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp @@ -38,8 +38,8 @@ #include "minecraft/mod/MetadataHandler.h" -ModFolderLoadTask::ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan, QObject* parent) - : Task(parent, 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()) +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()) {} void ModFolderLoadTask::executeTask() @@ -96,7 +96,10 @@ void ModFolderLoadTask::executeTask() } } - emitSucceeded(); + if (m_aborted) + emit finished(); + else + emitSucceeded(); } void ModFolderLoadTask::getFromMetadata() diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h index 840e95e1..0f18b8b9 100644 --- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h +++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h @@ -57,7 +57,15 @@ public: } public: - ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan = false, QObject* parent = nullptr); + ModFolderLoadTask(QDir mods_dir, QDir index_dir, bool is_indexed, bool clean_orphan = false); + + [[nodiscard]] bool canAbort() const override { return true; } + bool abort() override + { + m_aborted.store(true); + return true; + } + void executeTask() override; @@ -69,4 +77,6 @@ private: bool m_is_indexed; bool m_clean_orphan; ResultPtr m_result; + + std::atomic<bool> m_aborted = false; }; |