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