From 1d796e6cf639354614f1152baab65d317271c357 Mon Sep 17 00:00:00 2001 From: Pixel Date: Wed, 16 Nov 2011 17:26:28 -0800 Subject: Kind of a big revamp of the TaskMan / Task model, in order to introduce a TaskScheduler. The idea is that we need to support multiple task managers from multiple threads. So that revamp means we now should be able to support that, except the TaskScheduler needs to implement a round robin system, to distribute tasks across multiple task managers. But at least, the fundamental redesign to permit this is here. --- src/Task.cc | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'src/Task.cc') diff --git a/src/Task.cc b/src/Task.cc index 3772dd5..3a6f8ad 100644 --- a/src/Task.cc +++ b/src/Task.cc @@ -7,28 +7,29 @@ static Balau::LocalTmpl localTask; Balau::Task::Task() { + m_status = STARTING; + m_okayToEAgain = false; + + Printer::elog(E_TASK, "Created a Task at %p"); +} + +void Balau::Task::setup(TaskMan * taskMan) { size_t size = stackSize(); #ifndef _WIN32 m_stack = malloc(size); - coro_create(&m_ctx, coroutine, this, m_stack, size); + coro_create(&m_ctx, coroutineTrampoline, this, m_stack, size); #else m_stack = NULL; - m_fiber = CreateFiber(size, coroutine, this); + m_fiber = CreateFiber(size, coroutineTrampoline, this); #endif - m_taskMan = TaskMan::getTaskMan(); - m_taskMan->registerTask(this); + m_taskMan = taskMan; m_tls = g_tlsManager->createTLS(); void * oldTLS = g_tlsManager->getTLS(); g_tlsManager->setTLS(m_tls); localTask.set(this); g_tlsManager->setTLS(oldTLS); - - m_status = STARTING; - m_okayToEAgain = false; - - Printer::elog(E_TASK, "Created a Task at %p"); } Balau::Task::~Task() { @@ -37,27 +38,31 @@ Balau::Task::~Task() { free(m_tls); } -void Balau::Task::coroutine(void * arg) { +void Balau::Task::coroutineTrampoline(void * arg) { Task * task = reinterpret_cast(arg); Assert(task); - Assert(task->m_status == STARTING); + task->coroutine(); +} + +void Balau::Task::coroutine() { + Assert(m_status == STARTING); try { - task->m_status = RUNNING; - task->Do(); - task->m_status = STOPPED; + m_status = RUNNING; + Do(); + m_status = STOPPED; } catch (GeneralException & e) { - Printer::log(M_WARNING, "Task %s at %p caused an exception: `%s' - stopping.", task->getName(), task, e.getMsg()); - task->m_status = FAULTED; + Printer::log(M_WARNING, "Task %s at %p caused an exception: `%s' - stopping.", getName(), this, e.getMsg()); + m_status = FAULTED; } catch (...) { - Printer::log(M_WARNING, "Task %s at %p caused an unknown exception - stopping.", task->getName(), task); - task->m_status = FAULTED; + Printer::log(M_WARNING, "Task %s at %p caused an unknown exception - stopping.", getName(), this); + m_status = FAULTED; } #ifndef _WIN32 - coro_transfer(&task->m_ctx, &task->m_taskMan->m_returnContext); + coro_transfer(&m_ctx, &m_taskMan->m_returnContext); #else - SwitchToFiber(task->m_taskMan->m_fiber); + SwitchToFiber(m_taskMan->m_fiber); #endif } -- cgit v1.2.3