X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/5fd8cc8409d0efadc07dfe8d6774ad9ff477663d..24bebc0ecf83446c7371eff69042322aab34976a:/rpc/thr_pool.h?ds=sidebyside diff --git a/rpc/thr_pool.h b/rpc/thr_pool.h index 5095961..94ce237 100644 --- a/rpc/thr_pool.h +++ b/rpc/thr_pool.h @@ -1,66 +1,26 @@ -#ifndef __THR_POOL__ -#define __THR_POOL__ - -#include -#include +#ifndef thr_pool_h +#define thr_pool_h +#include "types.h" #include "fifo.h" -class ThrPool { - +typedef std::function job_t; +class ThrPool { public: - struct job_t { - void *(*f)(void *); //function point - void *a; //function arguments - }; - - ThrPool(int sz, bool blocking=true); + ThrPool(size_t sz, bool blocking=true); ~ThrPool(); - template bool addObjJob(C *o, void (C::*m)(A), A a); - void waitDone(); - bool takeJob(job_t *j); + bool addJob(const job_t &j); private: - pthread_attr_t attr_; - int nthreads_; + size_t nthreads_; bool blockadd_; - fifo jobq_; - std::vector th_; + std::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; - 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 -