diff --git a/include/Task.h b/include/Task.h index 321097e..6a18a77 100644 --- a/include/Task.h +++ b/include/Task.h @@ -490,6 +490,7 @@ private: template friend struct TaskAwaiterBase; template friend class Task; friend class TaskInternalBase; + friend class TaskManager; /// @endcond // Task Internal Storage diff --git a/include/TaskManager.h b/include/TaskManager.h index 7d47847..6822634 100644 --- a/include/TaskManager.h +++ b/include/TaskManager.h @@ -136,6 +136,19 @@ public: m_tasks.push_back(std::move(in_task)); } + Task<> ReleaseManagedTask(const WeakTaskHandle& in_task) + { + auto itWeak = std::find(m_tasks.begin(), m_tasks.end(), in_task); + assert(itWeak != m_tasks.end()); + m_tasks.erase(itWeak); + + auto itStrong = std::find(m_strongRefs.begin(), m_strongRefs.end(), in_task); + assert(itStrong != m_strongRefs.end()); + Task<> handle = itStrong->MoveToTask(); + m_strongRefs.erase(itStrong); + return handle; + } + /// Call Task::Kill() on all tasks (managed + unmanaged) void KillAllTasks() { @@ -174,6 +187,7 @@ public: size_t writeIdx = 0; for(size_t readIdx = 0; readIdx < m_tasks.size(); ++readIdx) { + m_currentTask = m_tasks[readIdx]; if(m_tasks[readIdx].Resume() != eTaskStatus::Done) { if(writeIdx != readIdx) @@ -184,6 +198,7 @@ public: } } m_tasks.resize(writeIdx); + m_currentTask = {}; // Prune strong tasks that are done auto removeIt = m_strongRefs.erase(std::remove_if(m_strongRefs.begin(), m_strongRefs.end(), [](const auto& in_taskHandle) { @@ -191,6 +206,11 @@ public: }), m_strongRefs.end()); } + WeakTaskHandle GetCurrentTask() + { + return m_currentTask; + } + /// Get a debug string containing a list of all active tasks std::string GetDebugString(std::optional in_formatter = {}) const { @@ -212,6 +232,7 @@ public: private: std::vector m_tasks; std::vector> m_strongRefs; + WeakTaskHandle m_currentTask; }; NAMESPACE_SQUID_END