summaryrefslogtreecommitdiff
path: root/includes/Task.h
blob: 314532b22443334beac20311e3dd0b8d9b199f6e (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
#pragma once

#include <stdlib.h>
#include <coro.h>

namespace Balau {

class TaskMan;

class Task {
  public:
    enum Status {
        STARTING,
        RUNNING,
        IDLE,
        STOPPED,
        FAULTED,
    };
      Task();
      ~Task() { free(stack); free(tls); }
    virtual void Do() = 0;
    virtual const char * getName() = 0;
    Status getStatus() { return status; }
  protected:
    void suspend();
  private:
    size_t stackSize() { return 128 * 1024; }
    void switchTo();
    static void coroutine(void *);
    void * stack;
    coro_context ctx;
    TaskMan * taskMan;
    Status status;
    void * tls;
    friend class TaskMan;
};

};