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