diff options
Diffstat (limited to 'src/Task.cc')
-rw-r--r-- | src/Task.cc | 46 |
1 files changed, 46 insertions, 0 deletions
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<Task *>(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); +} |