summaryrefslogtreecommitdiff
path: root/src/Task.cc
blob: d41f088d8a3a41083f3c4fa22633c2ce0afe103c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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);
}