35 #ifndef PTLIB_THREADPOOL_H
36 #define PTLIB_THREADPOOL_H
203 unsigned maxWorkerCount,
204 unsigned maxWorkUnitCount,
205 const char * threadName,
209 virtual bool CheckWorker(WorkerThreadBase * worker);
226 template <
class Work_T>
235 unsigned maxWorkers = 10,
236 unsigned maxWorkUnits = 0,
237 const char * threadName = NULL,
249 : WorkerThreadBase(priority, threadName)
255 virtual void AddWork(Work_T * work) = 0;
257 virtual void Main() = 0;
270 : InternalWorkBase(group)
306 bool AddWork(Work_T * work,
const char * group = NULL)
312 WorkerThread * worker;
313 if ((group == NULL) || (strlen(group) == 0)) {
324 worker = g->second.m_worker;
325 PTRACE(4,
"ThreadPool\tAllocated worker thread by group Id " << group);
334 InternalWork internalWork(worker, work, group);
340 if (!internalWork.m_group.empty()) {
341 typename GroupInfoMap_t::iterator r =
m_groupInfoMap.find(internalWork.m_group);
347 info.m_worker = worker;
348 m_groupInfoMap.insert(
typename GroupInfoMap_t::value_type(internalWork.m_group, info));
353 worker->AddWork(work);
361 bool RemoveWork(Work_T * work,
bool removeFromWorker =
true)
366 typename ExternalToInternalWorkMap_T::iterator iterWork = m_externalToInternalWorkMap.find(work);
367 if (iterWork == m_externalToInternalWorkMap.end())
370 InternalWork & internalWork = iterWork->second;
373 if (removeFromWorker)
374 internalWork.m_worker->RemoveWork(work);
377 if (!internalWork.m_group.empty()) {
378 typename GroupInfoMap_t::iterator iterGroup = m_groupInfoMap.find(internalWork.m_group);
379 PAssert(iterGroup != m_groupInfoMap.end(),
"Attempt to find thread from unknown work group");
380 if (iterGroup != m_groupInfoMap.end()) {
381 if (--iterGroup->second.m_count == 0)
382 m_groupInfoMap.erase(iterGroup);
387 CheckWorker(internalWork.m_worker);
390 m_externalToInternalWorkMap.erase(iterWork);
399 template <
class Work_T>
407 unsigned maxWorkers = 10,
408 unsigned maxWorkUnits = 0,
409 const char * threadName = NULL,
411 ) :
PThreadPool<Work_T>(maxWorkers, maxWorkUnits, threadName, priority)
419 const char * threadName = NULL)
439 Work_T * work =
m_queue.front();
447 return (
unsigned)
m_queue.size();
516 template <
class PtrClass,
typename FuncRet =
void>
529 , m_function(function)
534 (
dynamic_cast<PtrClass&
>(obj).*(this->m_function))();
543 typename FuncRet =
void
547 typedef FuncRet (PtrClass::*
Function)(Arg1Type arg1);
559 , m_function(function)
565 (
dynamic_cast<PtrClass&
>(obj).*(this->m_function))(
m_arg1);
575 typename FuncRet =
void
579 typedef FuncRet (PtrClass::*
Function)(Arg1Type arg1, Arg2Type arg2);
593 , m_function(function)
600 (
dynamic_cast<PtrClass&
>(obj).*(this->m_function))(
m_arg1,
m_arg2);
611 typename FuncRet =
void
615 typedef FuncRet (PtrClass::*
Function)(Arg1Type arg1, Arg2Type arg2, Arg3Type arg3);
631 , m_function(function)
644 #endif // PTLIB_THREADPOOL_H