diff --git a/source/mijin/async/coroutine.cpp b/source/mijin/async/coroutine.cpp index 6684b26..65da812 100644 --- a/source/mijin/async/coroutine.cpp +++ b/source/mijin/async/coroutine.cpp @@ -174,6 +174,20 @@ void SimpleTaskLoop::addStoredTask(StoredTask&& storedTask) noexcept } } +std::size_t SimpleTaskLoop::getActiveTasks() const noexcept +{ + std::size_t sum = 0; + for (const StoredTask& task : mijin::chain(tasks_, newTasks_)) + { + const TaskStatus status = task.task ? task.task->status() : TaskStatus::FINISHED; + if (status == TaskStatus::SUSPENDED || status == TaskStatus::RUNNING) + { + ++sum; + } + } + return sum; +} + void MultiThreadedTaskLoop::transferCurrentTask(TaskLoop& otherLoop) noexcept { if (&otherLoop == this) { diff --git a/source/mijin/async/coroutine.hpp b/source/mijin/async/coroutine.hpp index a45c878..f659b38 100644 --- a/source/mijin/async/coroutine.hpp +++ b/source/mijin/async/coroutine.hpp @@ -542,6 +542,7 @@ public: // TaskLoop implementation public: // public interface [[nodiscard]] constexpr bool empty() const noexcept { return tasks_.empty() && newTasks_.empty(); } [[nodiscard]] constexpr std::size_t getNumTasks() const noexcept { return tasks_.size() + newTasks_.size(); } + [[nodiscard]] std::size_t getActiveTasks() const noexcept; inline CanContinue tick(); inline void runUntilDone(IgnoreWaiting ignoreWaiting = IgnoreWaiting::NO); inline void cancelAllTasks() noexcept;