Fixed coroutine cleanup.

This commit is contained in:
Patrick 2023-11-11 01:37:59 +01:00
parent dabaf6d903
commit ae5e73aa58

View File

@ -49,6 +49,44 @@ class TaskLoop;
template<typename TResult = void>
class TaskBase;
namespace impl
{
struct TaskCancelled : std::exception {};
inline void throwIfCancelled();
} // namespace impl
template<typename T>
struct TaskState
{
Optional<T> 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<void>
{
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<typename TReturn, typename TPromise>
@ -79,41 +117,7 @@ struct TaskReturn<void, TPromise>
(static_cast<TPromise&>(*this).state_) = TaskState<void>(std::current_exception());
}
};
struct TaskCancelled : std::exception {};
inline void throwIfCancelled();
} // namespace impl
template<typename T>
struct TaskState
{
Optional<T> 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<void>
{
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<typename TValue>
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<TResult>::~TaskBase() noexcept
{
if (handle_)
{
// handle_.destroy();
handle_.destroy();
}
}