4427aeeba144bd571d4a550faf7184ed937105cf
[invirt/third/libt4.git] / rpc / thr_pool.h
1 #ifndef thr_pool_h
2 #define thr_pool_h
3
4 #include <vector>
5 #include <thread>
6
7 #include "fifo.h"
8
9 class ThrPool {
10         public:
11                 struct job_t {
12                         void (*f)(void *); //function point
13                         void *a; //function arguments
14                 };
15
16                 ThrPool(int sz, bool blocking=true);
17                 ~ThrPool();
18                 template<class C, class A> bool addObjJob(C *o, void (C::*m)(A), A a);
19                 void waitDone();
20
21                 bool takeJob(job_t *j);
22
23         private:
24                 int nthreads_;
25                 bool blockadd_;
26
27
28                 fifo<job_t> jobq_;
29                 std::vector<std::thread> th_;
30
31                 bool addJob(void (*f)(void *), void *a);
32 };
33
34 template <class C, class A> bool 
35 ThrPool::addObjJob(C *o, void (C::*m)(A), A a)
36 {
37
38         class objfunc_wrapper {
39                 public:
40                         C *o;
41                         void (C::*m)(A a);
42                         A a;
43                         static void func(void *vvv) {
44                                 objfunc_wrapper *x = (objfunc_wrapper*)vvv;
45                                 C *o = x->o;
46                                 void (C::*m)(A ) = x->m;
47                                 A a = x->a;
48                                 (o->*m)(a);
49                                 delete x;
50                         }
51         };
52
53         objfunc_wrapper *x = new objfunc_wrapper;
54         x->o = o;
55         x->m = m;
56         x->a = a;
57         return addJob(&objfunc_wrapper::func, (void *)x);
58 }
59
60
61 #endif
62