From 5a283e5b2b523d53e3504292c386b534dc74386a Mon Sep 17 00:00:00 2001 From: Pixel Date: Fri, 7 Oct 2011 09:27:04 -0700 Subject: Preliminary work for the Task manager. Added libcoro submodule. Also refactored some pieces of code. --- src/Task.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/Task.cc (limited to 'src/Task.cc') diff --git a/src/Task.cc b/src/Task.cc new file mode 100644 index 0000000..d41f088 --- /dev/null +++ b/src/Task.cc @@ -0,0 +1,46 @@ +#include "Task.h" +#include "TaskMan.h" +#include "Exceptions.h" +#include "Printer.h" +#include "Local.h" + +Balau::Task::Task() { + size_t size = stackSize(); + stack = malloc(size); + coro_create(&ctx, coroutine, this, stack, size); + taskMan = TaskMan::getTaskMan(); + tls = tlsManager->createTLS(); + status = STARTING; +} + +void Balau::Task::coroutine(void * arg) { + Task * task = reinterpret_cast(arg); + Assert(task); + try { + task->status = RUNNING; + task->Do(); + task->status = STOPPED; + } + catch (GeneralException & e) { + Printer::log(M_WARNING, "Task %s caused an exception: `%s' - stopping.", task->getName(), e.getMsg()); + task->status = FAULTED; + } + catch (...) { + Printer::log(M_WARNING, "Task %s caused an unknown exception - stopping.", task->getName()); + task->status = FAULTED; + } + coro_transfer(&task->ctx, &task->taskMan->returnContext); +} + +void Balau::Task::switchTo() { + status = RUNNING; + void * oldTLS = tlsManager->getTLS(); + tlsManager->setTLS(tls); + coro_transfer(&taskMan->returnContext, &ctx); + tlsManager->setTLS(oldTLS); + status = IDLE; +} + +void Balau::Task::suspend() { + coro_transfer(&ctx, &taskMan->returnContext); +} -- cgit v1.2.3