From ae5e73aa58905c8037724f61f1908b64e891e4f9 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Sat, 11 Nov 2023 01:37:59 +0100 Subject: [PATCH] Fixed coroutine cleanup. --- source/mijin/async/coroutine.hpp | 78 +++++++++++++++++--------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/source/mijin/async/coroutine.hpp b/source/mijin/async/coroutine.hpp index 36f0284..64a6bf8 100644 --- a/source/mijin/async/coroutine.hpp +++ b/source/mijin/async/coroutine.hpp @@ -49,6 +49,44 @@ class TaskLoop; template class TaskBase; +namespace impl +{ +struct TaskCancelled : std::exception {}; + +inline void throwIfCancelled(); +} // namespace impl + +template +struct TaskState +{ + Optional value; + std::exception_ptr exception; + TaskStatus status = TaskStatus::SUSPENDED; + + TaskState() = default; + TaskState(const TaskState&) = default; + TaskState(TaskState&&) noexcept = default; + inline TaskState(T _value, TaskStatus _status) noexcept : value(std::move(_value)), status(_status) {} + inline TaskState(std::exception_ptr _exception) noexcept : exception(std::move(_exception)), status(TaskStatus::FINISHED) {} + TaskState& operator=(const TaskState&) = default; + TaskState& operator=(TaskState&&) noexcept = default; +}; + +template<> +struct TaskState +{ + std::exception_ptr exception; + TaskStatus status = TaskStatus::SUSPENDED; + + TaskState() = default; + TaskState(const TaskState&) = default; + TaskState(TaskState&&) noexcept = default; + inline TaskState(TaskStatus _status) noexcept : status(_status) {} + inline TaskState(std::exception_ptr _exception) noexcept : exception(std::move(_exception)), status(TaskStatus::FINISHED) {} + TaskState& operator=(const TaskState&) = default; + TaskState& operator=(TaskState&&) noexcept = default; +}; + namespace impl { template @@ -79,41 +117,7 @@ struct TaskReturn (static_cast(*this).state_) = TaskState(std::current_exception()); } }; - -struct TaskCancelled : std::exception {}; - -inline void throwIfCancelled(); -} // namespace impl - -template -struct TaskState -{ - Optional value; - std::exception_ptr exception; - TaskStatus status = TaskStatus::SUSPENDED; - - TaskState() = default; - TaskState(const TaskState&) = default; - TaskState(TaskState&&) noexcept = default; - inline TaskState(T _value, TaskStatus _status) noexcept : value(std::move(_value)), status(_status) {} - inline TaskState(std::exception_ptr _exception) noexcept : exception(std::move(_exception)), status(TaskStatus::FINISHED) {} - TaskState& operator=(const TaskState&) = default; - TaskState& operator=(TaskState&&) noexcept = default; -}; -template<> -struct TaskState -{ - std::exception_ptr exception; - TaskStatus status = TaskStatus::SUSPENDED; - - TaskState() = default; - TaskState(const TaskState&) = default; - TaskState(TaskState&&) noexcept = default; - inline TaskState(TaskStatus _status) noexcept : status(_status) {} - inline TaskState(std::exception_ptr _exception) noexcept : exception(std::move(_exception)), status(TaskStatus::FINISHED) {} - TaskState& operator=(const TaskState&) = default; - TaskState& operator=(TaskState&&) noexcept = default; -}; +} template struct TaskAwaitableFuture @@ -304,7 +308,7 @@ private: public: constexpr explicit TaskBase(handle_t handle) noexcept : handle_(handle) {} TaskBase(const TaskBase&) = delete; - TaskBase(TaskBase&& other) noexcept = default; + TaskBase(TaskBase&& other) noexcept : handle_(std::exchange(other.handle_, nullptr)) {} ~TaskBase() noexcept; public: TaskBase& operator=(const TaskBase&) = default; @@ -548,7 +552,7 @@ TaskBase::~TaskBase() noexcept { if (handle_) { - // handle_.destroy(); + handle_.destroy(); } }