]> git.tdb.fi Git - builder.git/blob - source/internaltask.h
Redesign GnuLinker to work without subtools
[builder.git] / source / internaltask.h
1 #ifndef INTERNALTASK_H_
2 #define INTERNALTASK_H_
3
4 #include <functional>
5 #include <msp/core/thread.h>
6 #include "task.h"
7
8 /**
9 Runs a worker thread.  Tools should derive a thread class from
10 InternalTask::Worker.  The worker thread must set its status to either SUCCESS
11 or ERROR before terminating.
12 */
13 class InternalTask: public Task
14 {
15 private:
16         class Worker: public Msp::Thread
17         {
18                 friend class InternalTask;
19
20         private:
21                 std::function<bool()> func;
22                 volatile Status status = Task::RUNNING;
23
24         public:
25                 Worker(std::function<bool()> f): func(f) { }
26
27                 Status get_status() const { return status; }
28
29         private:
30                 void main() override;
31         };
32
33         Worker worker;
34
35 public:
36         InternalTask(std::function<bool()> f): worker(f) { }
37         ~InternalTask();
38
39         std::string get_command() const override { return "<internal>"; }
40         void start() override;
41         Status check() override;
42         Status wait() override;
43 };
44
45 #endif