#include "smud_threads.h" ThreadPool::ThreadPool() { } ThreadPool::~ThreadPool() { } bool ThreadPool::Start() { m_pWorker = new ThreadWorker(); if (!m_pWorker->Start()) { delete m_pWorker; return false; } return true; } void ThreadPool::Stop() { m_pWorker->CancelAndWait(); delete m_pWorker; } void ThreadPool::AddConnection(int fd) { m_pWorker->AddConnection(fd); } ThreadWorker::ThreadWorker() : m_bShouldCancel(false) { } ThreadWorker::~ThreadWorker() { } bool ThreadWorker::Start() { m_pPool = new ConnectionPool(); pthread_mutex_init(&m_NotifyLock, NULL); pthread_cond_init(&m_Notify, NULL); if (pthread_create(&m_Thread, NULL, ThreadCallback, this) != 0) { return false; } return true; } void ThreadWorker::CancelAndWait() { m_bShouldCancel = true; pthread_join(m_Thread, NULL); pthread_cond_destroy(&m_Notify); pthread_mutex_destroy(&m_NotifyLock); delete m_pPool; } void ThreadWorker::AddConnection( int fd ) { m_pPool->AddConnection(fd); } void ThreadWorker::Process() { m_pPool->Process(&m_bShouldCancel); } void *ThreadCallback(void *data) { ((ThreadWorker *)data)->Process(); pthread_exit(NULL); }