X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/a4175b2e216a20b86cc872dea8a08005c60617a5..3abd3952c1f4441f0dd6eae9883b2d01ed9cd56b:/rpc/thr_pool.h diff --git a/rpc/thr_pool.h b/rpc/thr_pool.h index 4427aee..5950a9c 100644 --- a/rpc/thr_pool.h +++ b/rpc/thr_pool.h @@ -1,62 +1,26 @@ #ifndef thr_pool_h #define thr_pool_h -#include -#include - +#include "types.h" #include "fifo.h" -class ThrPool { - public: - struct job_t { - void (*f)(void *); //function point - void *a; //function arguments - }; - - ThrPool(int sz, bool blocking=true); - ~ThrPool(); - template bool addObjJob(C *o, void (C::*m)(A), A a); - void waitDone(); +typedef function job_t; - bool takeJob(job_t *j); +class ThrPool { + public: + ThrPool(size_t sz, bool blocking=true); + ~ThrPool(); - private: - int nthreads_; - bool blockadd_; + bool addJob(const job_t &j); + private: + size_t nthreads_; + bool blockadd_; - fifo jobq_; - std::vector th_; + fifo jobq_; + vector th_; - bool addJob(void (*f)(void *), void *a); + void do_worker(); }; -template 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; - } - }; - - objfunc_wrapper *x = new objfunc_wrapper; - x->o = o; - x->m = m; - x->a = a; - return addJob(&objfunc_wrapper::func, (void *)x); -} - - #endif -