Lots more clean-ups
[invirt/third/libt4.git] / rpc / thr_pool.h
index 5095961..5950a9c 100644 (file)
@@ -1,66 +1,26 @@
-#ifndef __THR_POOL__
-#define __THR_POOL__
-
-#include <pthread.h>
-#include <vector>
+#ifndef thr_pool_h
+#define thr_pool_h
 
+#include "types.h"
 #include "fifo.h"
 
-class ThrPool {
-
+typedef function<void()> job_t;
 
-       public:
-               struct job_t {
-                       void *(*f)(void *); //function point
-                       void *a; //function arguments
-               };
-
-               ThrPool(int sz, bool blocking=true);
-               ~ThrPool();
-               template<class C, class A> bool addObjJob(C *o, void (C::*m)(A), A a);
-               void waitDone();
-
-               bool takeJob(job_t *j);
+class ThrPool {
+    public:
+        ThrPool(size_t sz, bool blocking=true);
+        ~ThrPool();
 
-       private:
-               pthread_attr_t attr_;
-               int nthreads_;
-               bool blockadd_;
+        bool addJob(const job_t &j);
 
+    private:
+        size_t nthreads_;
+        bool blockadd_;
 
-               fifo<job_t> jobq_;
-               std::vector<pthread_t> th_;
+        fifo<job_t> jobq_;
+        vector<thread> th_;
 
-               bool addJob(void *(*f)(void *), void *a);
+        void do_worker();
 };
 
-       template <class C, class A> bool 
-ThrPool::addObjJob(C *o, void (C::*m)(A), A a)
-{
-
-       class objfunc_wrapper {
-               public:
-                       C *o;
-                       void (C::*m)(A a);
-                       A a;
-                       static void *func(void *vvv) {
-                               objfunc_wrapper *x = (objfunc_wrapper*)vvv;
-                               C *o = x->o;
-                               void (C::*m)(A ) = x->m;
-                               A a = x->a;
-                               (o->*m)(a);
-                               delete x;
-                               return 0;
-                       }
-       };
-
-       objfunc_wrapper *x = new objfunc_wrapper;
-       x->o = o;
-       x->m = m;
-       x->a = a;
-       return addJob(&objfunc_wrapper::func, (void *)x);
-}
-
-
 #endif
-