Added methods for task context switching.

This commit is contained in:
Patrick 2023-02-05 13:25:18 +01:00
parent 6b93f54653
commit c8edb195f4
Signed by: mewin
GPG Key ID: CEDB412C39B5BC47
2 changed files with 22 additions and 0 deletions

View File

@ -490,6 +490,7 @@ private:
template <typename, eTaskRef, eTaskResumable, typename> friend struct TaskAwaiterBase;
template <typename, eTaskRef, eTaskResumable> friend class Task;
friend class TaskInternalBase;
friend class TaskManager;
/// @endcond
// Task Internal Storage

View File

@ -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<void, eTaskRef::Strong, eTaskResumable::Yes>();
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<TaskDebugStackFormatter> in_formatter = {}) const
{
@ -212,6 +232,7 @@ public:
private:
std::vector<WeakTask> m_tasks;
std::vector<TaskHandle<>> m_strongRefs;
WeakTaskHandle m_currentTask;
};
NAMESPACE_SQUID_END