35 #ifndef PTLIB_THREADPOOL_H
36 #define PTLIB_THREADPOOL_H
198 PThreadPoolBase(
unsigned maxWorkerCount = 10,
unsigned maxWorkUnitCount = 0);
200 virtual bool CheckWorker(WorkerThreadBase * worker);
214 template <
class Work_T>
233 : WorkerThreadBase(priority)
238 virtual void AddWork(Work_T * work) = 0;
240 virtual void Main() = 0;
253 : InternalWorkBase(group)
289 bool AddWork(Work_T * work,
const char * group = NULL)
296 if ((group == NULL) || (strlen(group) == 0)) {
307 worker = g->second.m_worker;
308 PTRACE(4,
"ThreadPool\tAllocated worker thread by group Id " << group);
323 if (!internalWork.m_group.empty()) {
324 typename GroupInfoMap_t::iterator r =
m_groupInfoMap.find(internalWork.m_group);
330 info.m_worker = worker;
331 m_groupInfoMap.insert(
typename GroupInfoMap_t::value_type(internalWork.m_group, info));
336 worker->AddWork(work);
344 bool RemoveWork(Work_T * work,
bool removeFromWorker =
true)
349 typename ExternalToInternalWorkMap_T::iterator iterWork = m_externalToInternalWorkMap.find(work);
350 if (iterWork == m_externalToInternalWorkMap.end())
356 if (removeFromWorker)
360 if (!internalWork.m_group.empty()) {
361 typename GroupInfoMap_t::iterator iterGroup = m_groupInfoMap.find(internalWork.m_group);
362 PAssert(iterGroup != m_groupInfoMap.end(),
"Attempt to find thread from unknown work group");
363 if (iterGroup != m_groupInfoMap.end()) {
364 if (--iterGroup->second.m_count == 0)
365 m_groupInfoMap.erase(iterGroup);
373 m_externalToInternalWorkMap.erase(iterWork);
382 template <
class Work_T>
413 Work_T * work =
m_queue.front();
421 return (
unsigned)
m_queue.size();
463 #endif // PTLIB_THREADPOOL_H