]> AND Private Git Repository - loba.git/blob - msg_thread.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Move loading of atomic vs. cstdatomic in atomic_compat.h.
[loba.git] / msg_thread.h
1 #ifndef MSG_THREAD_H
2 #define MSG_THREAD_H
3
4 #include <string>
5 #include <msg/msg.h>
6 #include "synchro.h"
7
8 class msg_thread {
9 public:
10     msg_thread();
11     msg_thread(const char* name);
12     virtual ~msg_thread();
13
14     void start();
15     void wait();
16
17     virtual void run() = 0;
18
19 private:
20     bool started;
21     mutex_t mutex;
22     condition_t cond;
23     m_process_t thread;
24     std::string thread_name;
25
26     void run_wrapper();
27     static int start_wrapper(int, char* []);
28 };
29
30 template <typename Func>
31 class msg_thread_wrapper: public msg_thread {
32 public:
33     msg_thread_wrapper(const char* name, Func run)
34         : msg_thread(name)
35         , real_run(run)
36     { }
37     void run() { real_run(); }
38 private:
39     Func real_run;
40 };
41
42 template <typename Func>
43 msg_thread* new_msg_thread(const char* name, Func run)
44 {
45     return new msg_thread_wrapper<Func>(name, run);
46 }
47
48 #endif // !MSG_THREAD_H
49
50 // Local variables:
51 // mode: c++
52 // End: