diff -r c7b4237fff50 -r 03a67e41afbc core/thread/BaseWorker.cpp --- a/core/thread/BaseWorker.cpp Fri Mar 28 06:21:34 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,303 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * SourceMod - * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or . - * - * Version: $Id$ - */ - -#include "BaseWorker.h" - -BaseWorker::BaseWorker(IThreadWorkerCallbacks *hooks) : - m_perFrame(SM_DEFAULT_THREADS_PER_FRAME), - m_state(Worker_Stopped), - m_pHooks(hooks) -{ -} - -BaseWorker::~BaseWorker() -{ - if (m_state != Worker_Stopped || m_state != Worker_Invalid) - Stop(true); - - if (m_ThreadQueue.size()) - Flush(true); -} - -void BaseWorker::MakeThread(IThread *pThread) -{ - ThreadParams pt; - - pt.flags = Thread_AutoRelease; - pt.prio = ThreadPrio_Normal; - - MakeThread(pThread, &pt); -} - -IThreadHandle *BaseWorker::MakeThread(IThread *pThread, ThreadFlags flags) -{ - ThreadParams pt; - - pt.flags = flags; - pt.prio = ThreadPrio_Normal; - - return MakeThread(pThread, &pt); -} - -IThreadHandle *BaseWorker::MakeThread(IThread *pThread, const ThreadParams *params) -{ - if (m_state != Worker_Running) - return NULL; - - SWThreadHandle *swt = new SWThreadHandle(this, params, pThread); - - AddThreadToQueue(swt); - - return swt; -} - -void BaseWorker::GetPriorityBounds(ThreadPriority &max, ThreadPriority &min) -{ - max = ThreadPrio_Normal; - min = ThreadPrio_Normal; -} - -unsigned int BaseWorker::Flush(bool flush_cancel) -{ - SWThreadHandle *swt; - unsigned int num = 0; - - while ((swt=PopThreadFromQueue()) != NULL) - { - swt->m_state = Thread_Done; - if (!flush_cancel) - swt->pThread->RunThread(swt); - swt->pThread->OnTerminate(swt, flush_cancel); - if (swt->m_params.flags & Thread_AutoRelease) - delete swt; - num++; - } - - return num; -} - -SWThreadHandle *BaseWorker::PopThreadFromQueue() -{ - if (!m_ThreadQueue.size()) - return NULL; - - SourceHook::List::iterator begin; - SWThreadHandle *swt; - - begin = m_ThreadQueue.begin(); - swt = (*begin); - m_ThreadQueue.erase(begin); - - return swt; -} - -void BaseWorker::AddThreadToQueue(SWThreadHandle *pHandle) -{ - m_ThreadQueue.push_back(pHandle); -} - -unsigned int BaseWorker::GetMaxThreadsPerFrame() -{ - return m_perFrame; -} - -WorkerState BaseWorker::GetStatus(unsigned int *threads) -{ - if (threads) - *threads = m_perFrame; - - return m_state; -} - -unsigned int BaseWorker::RunFrame() -{ - unsigned int done = 0; - unsigned int max = GetMaxThreadsPerFrame(); - SWThreadHandle *swt = NULL; - IThread *pThread = NULL; - - while (done < max) - { - if ((swt=PopThreadFromQueue()) == NULL) - { - break; - } - pThread = swt->pThread; - swt->m_state = Thread_Running; - pThread->RunThread(swt); - swt->m_state = Thread_Done; - pThread->OnTerminate(swt, false); - if (swt->m_params.flags & Thread_AutoRelease) - { - delete swt; - } - done++; - } - - return done; -} - -void BaseWorker::SetMaxThreadsPerFrame(unsigned int threads) -{ - m_perFrame = threads; -} - -bool BaseWorker::Start() -{ - if (m_state != Worker_Invalid && m_state != Worker_Stopped) - { - return false; - } - - m_state = Worker_Running; - - if (m_pHooks) - { - m_pHooks->OnWorkerStart(this); - } - - return true; -} - -bool BaseWorker::Stop(bool flush_cancel) -{ - if (m_state == Worker_Invalid || m_state == Worker_Stopped) - { - return false; - } - - if (m_state == Worker_Paused) - { - if (!Unpause()) - { - return false; - } - } - - m_state = Worker_Stopped; - Flush(flush_cancel); - - if (m_pHooks) - { - m_pHooks->OnWorkerStop(this); - } - - return true; -} - -bool BaseWorker::Pause() -{ - if (m_state != Worker_Running) - { - return false; - } - - m_state = Worker_Paused; - - return true; -} - - -bool BaseWorker::Unpause() -{ - if (m_state != Worker_Paused) - { - return false; - } - - m_state = Worker_Running; - - return true; -} - -/*********************** - * THREAD HANDLE STUFF * - ***********************/ - -void SWThreadHandle::DestroyThis() -{ - delete this; -} - -void SWThreadHandle::GetParams(ThreadParams *p) -{ - *p = m_params; -} - -ThreadPriority SWThreadHandle::GetPriority() -{ - return m_params.prio; -} - -ThreadState SWThreadHandle::GetState() -{ - return m_state; -} - -IThreadCreator *SWThreadHandle::Parent() -{ - return m_parent; -} - -bool SWThreadHandle::SetPriority(ThreadPriority prio) -{ - if (m_params.prio != ThreadPrio_Normal) - return false; - - m_params.prio = prio; - - return true; -} - -bool SWThreadHandle::Unpause() -{ - if (m_state != Thread_Paused) - return false; - - m_state = Thread_Running; - - return true; -} - -bool SWThreadHandle::WaitForThread() -{ - return false; -} - -SWThreadHandle::SWThreadHandle(IThreadCreator *parent, const ThreadParams *p, IThread *thread) : - m_state(Thread_Paused), m_params(*p), m_parent(parent), pThread(thread) -{ -} - -IThread *SWThreadHandle::GetThread() -{ - return pThread; -}