summaryrefslogtreecommitdiff
path: root/src/Task.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Task.cc')
-rw-r--r--src/Task.cc46
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);
+}