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);
}
|