summaryrefslogtreecommitdiff
path: root/includes/LuaTask.h
blob: ee9d7a79cd395d39ab9517a1c87bce56d2eccfaa (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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#pragma once

#include <c++11-surrogates.h>
#include <BLua.h>
#include <Task.h>

namespace Balau {

class LuaTask;
class LuaMainTask;

class LuaExecCell {
  public:
      LuaExecCell() : m_detached(false) { }
    void detach() { m_detached = true; }
    void exec(LuaMainTask * mainTask);
  protected:
    virtual void run(Lua &) = 0;
  private:
    Events::Async m_event;
    bool m_detached;
    friend class LuaTask;
};

class LuaExecString : public LuaExecCell {
  public:
      LuaExecString(const String & str) : m_str(str) { }
  private:
    virtual void run(Lua &);
    String m_str;
};

class LuaExecFile : public LuaExecCell {
  public:
      LuaExecFile(IO<Handle> file) : m_file(file) { }
  private:
    virtual void run(Lua &);
    IO<Handle> m_file;
};

class LuaTask : public Task {
  public:
      ~LuaTask() { L.weaken(); }
    virtual const char * getName() const { return "LuaTask"; }
  private:
      LuaTask(Lua && __L, LuaExecCell * cell) : L(Move(__L)), m_cell(cell) { }
    virtual void Do();
    Lua L;
    LuaExecCell * m_cell;
    friend class LuaMainTask;
};

class LuaMainTask : public Task {
  public:
      LuaMainTask();
      ~LuaMainTask();
    void stop();
    virtual const char * getName() const { return "LuaMainTask"; }
  private:
    void exec(LuaExecCell * cell);
    virtual void Do();
    Lua L;
    Queue<LuaExecCell> m_queue;
    volatile bool m_stopping;
    friend class LuaExecCell;
};

};