From a76dabb12734154177a78033324b40365e7c6f21 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 21 Jul 2021 14:46:48 +0200 Subject: Fix freeze on search reset in manga combined plugin. Fix multithreading issues in AsyncTask --- include/AsyncTask.hpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'include/AsyncTask.hpp') diff --git a/include/AsyncTask.hpp b/include/AsyncTask.hpp index 6148923..45b3397 100644 --- a/include/AsyncTask.hpp +++ b/include/AsyncTask.hpp @@ -3,6 +3,7 @@ #include "Program.hpp" #include #include +#include namespace QuickMedia { template @@ -13,6 +14,7 @@ namespace QuickMedia { AsyncTask() = default; AsyncTask(CallbackFunc callback_func, Args&&... args) { + std::lock_guard lock(mutex); std::promise promise; future = promise.get_future(); thread = std::thread(&AsyncTask::thread_handler, this, std::move(promise), std::move(callback_func), std::forward(args)...); @@ -20,12 +22,14 @@ namespace QuickMedia { AsyncTask(AsyncTask &&other) { cancel(); + std::lock_guard lock(mutex); thread = std::move(other.thread); future = std::move(other.future); } AsyncTask& operator=(AsyncTask &&other) { cancel(); + std::lock_guard lock(mutex); thread = std::move(other.thread); future = std::move(other.future); return *this; @@ -36,22 +40,40 @@ namespace QuickMedia { } bool valid() { + std::lock_guard lock(mutex); return future.valid(); } bool ready() { + std::lock_guard lock(mutex); return future.valid() && future.wait_for(std::chrono::seconds(0)) == std::future_status::ready; } T get() { - thread.join(); - return future.get(); + std::lock_guard lock(mutex); + if constexpr(std::is_same::value) { + if(thread.joinable()) { + thread.join(); + future.get(); + } + } else { + T result; + if(thread.joinable()) { + thread.join(); + result = std::move(future.get()); + } + return result; + } } void cancel() { - if(valid()) { + std::lock_guard lock(mutex); + if(future.valid()) { program_kill_in_thread(thread.get_id()); - get(); + if(thread.joinable()) { + thread.join(); + future.get(); + } } } private: @@ -66,5 +88,6 @@ namespace QuickMedia { private: std::thread thread; std::future future; + std::mutex mutex; }; } \ No newline at end of file -- cgit v1.2.3