]> git.tdb.fi Git - libs/core.git/blob - source/core/thread.h
Move most platform-specific code into overlay directories
[libs/core.git] / source / core / thread.h
1 #ifndef MSP_CORE_THREAD_H_
2 #define MSP_CORE_THREAD_H_
3
4 namespace Msp {
5
6 /**
7 Base class for threads.  To create a thread for some task, derive it from this
8 class and implement the main() function.  Note that threads are not
9 automatically started upon creation - you must manually call launch() instead.
10 This is to allow initializing variables of the derived class before the thread
11 is started.
12 */
13 class Thread
14 {
15 private:
16         struct Private;
17
18         enum State
19         {
20                 PENDING,
21                 RUNNING,
22                 FINISHED,
23                 KILLED,
24                 JOINED
25         };
26
27         Private *priv_;
28         State state_;
29
30 protected:
31         Thread();
32 private:
33         Thread(const Thread &);
34         Thread &operator=(const Thread &);
35 public:
36         virtual ~Thread();
37
38         /** Indicates whether the thread has finished running. */
39         bool is_finished() { return state_>=FINISHED; }
40
41         /** Waits for the thread to exit.  Calling this from the thread will cause a
42         deadlock. */
43         void join();
44
45         /** Violently terminates the thread.  This should only be used as a last
46         resort, as the thread gets no chance to clean up. */
47         void kill();
48
49 protected:
50         /** Starts the thread.  Can only be called once for each Thread instance. */
51         void launch();
52
53 private:
54         void platform_join();
55         void platform_kill();
56         void platform_launch();
57
58 protected:
59         virtual void main() = 0;
60 };
61
62 } // namespace Msp
63
64 #endif