From 864eeb3a526b1a32c72e1f31a3e1f23dcc5c7409 Mon Sep 17 00:00:00 2001 From: Pixel Date: Sun, 9 Oct 2011 01:12:50 -0700 Subject: More work on the Task manager. Now "Main" is a Task, among the most important changes. Introduced the notion of Events, and managed a coherent task switch. Also, renamed a lot of the variables to have a more coherent naming scheme. --- src/Task.cc | 64 +++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 21 deletions(-) (limited to 'src/Task.cc') diff --git a/src/Task.cc b/src/Task.cc index 9bdad0c..73a2329 100644 --- a/src/Task.cc +++ b/src/Task.cc @@ -4,50 +4,72 @@ #include "Printer.h" #include "Local.h" +static Balau::LocalTmpl localTask; + Balau::Task::Task() { size_t size = stackSize(); - stack = malloc(size); - coro_create(&ctx, coroutine, this, stack, size); - taskMan = TaskMan::getTaskMan(); - taskMan->registerTask(this); - tls = tlsManager->createTLS(); - status = STARTING; + m_stack = malloc(size); + coro_create(&m_ctx, coroutine, this, m_stack, size); + + m_taskMan = TaskMan::getTaskMan(); + m_taskMan->registerTask(this); + + 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; } Balau::Task::~Task() { - free(stack); - free(tls); + free(m_stack); + free(m_tls); } void Balau::Task::coroutine(void * arg) { Task * task = reinterpret_cast(arg); Assert(task); try { - task->status = RUNNING; + task->m_status = RUNNING; task->Do(); - task->status = STOPPED; + task->m_status = STOPPED; } catch (GeneralException & e) { Printer::log(M_WARNING, "Task %s caused an exception: `%s' - stopping.", task->getName(), e.getMsg()); - task->status = FAULTED; + task->m_status = FAULTED; } catch (...) { Printer::log(M_WARNING, "Task %s caused an unknown exception - stopping.", task->getName()); - task->status = FAULTED; + task->m_status = FAULTED; } - coro_transfer(&task->ctx, &task->taskMan->returnContext); + coro_transfer(&task->m_ctx, &task->m_taskMan->m_returnContext); } void Balau::Task::switchTo() { - status = RUNNING; - void * oldTLS = tlsManager->getTLS(); - tlsManager->setTLS(tls); - coro_transfer(&taskMan->returnContext, &ctx); - tlsManager->setTLS(oldTLS); - if (status == RUNNING) - status = IDLE; + m_status = RUNNING; + void * oldTLS = g_tlsManager->getTLS(); + g_tlsManager->setTLS(m_tls); + coro_transfer(&m_taskMan->m_returnContext, &m_ctx); + g_tlsManager->setTLS(oldTLS); + if (m_status == RUNNING) + m_status = IDLE; } void Balau::Task::suspend() { - coro_transfer(&ctx, &taskMan->returnContext); + coro_transfer(&m_ctx, &m_taskMan->m_returnContext); +} + +Balau::Task * Balau::Task::getCurrentTask() { + return localTask.get(); +} + +void Balau::Task::waitFor(Balau::Events::BaseEvent * e) { + e->registerOwner(this); + // probably have to register the event in the Task manager +} + +Balau::Events::TaskEvent::TaskEvent(Task * taskWaited) : m_taskWaited(taskWaited) { + m_taskWaited->m_waitedBy.push_back(this); } -- cgit v1.2.3