core/thread/ThreadWorker.cpp
changeset 1090 5c54e353c019
parent 1084 241c1b9b4048
child 1231 17badaf66ce4
     1.1 --- a/core/thread/ThreadWorker.cpp	Thu Jul 12 02:57:43 2007 +0000
     1.2 +++ b/core/thread/ThreadWorker.cpp	Thu Jul 12 16:57:26 2007 +0000
     1.3 @@ -14,7 +14,7 @@
     1.4  
     1.5  #include "ThreadWorker.h"
     1.6  
     1.7 -ThreadWorker::ThreadWorker() : 
     1.8 +ThreadWorker::ThreadWorker(IThreadWorkerCallbacks *hooks) : BaseWorker(hooks),
     1.9  	m_Threader(NULL),
    1.10  	m_QueueLock(NULL),
    1.11  	m_StateLock(NULL),
    1.12 @@ -26,7 +26,8 @@
    1.13  	m_state = Worker_Invalid;
    1.14  }
    1.15  
    1.16 -ThreadWorker::ThreadWorker(IThreader *pThreader, unsigned int thinktime) : 
    1.17 +ThreadWorker::ThreadWorker(IThreadWorkerCallbacks *hooks, IThreader *pThreader, unsigned int thinktime) : 
    1.18 +	BaseWorker(hooks),
    1.19  	m_Threader(pThreader),
    1.20  	m_QueueLock(NULL),
    1.21  	m_StateLock(NULL),
    1.22 @@ -46,10 +47,14 @@
    1.23  ThreadWorker::~ThreadWorker()
    1.24  {
    1.25  	if (m_state != Worker_Stopped || m_state != Worker_Invalid)
    1.26 +	{
    1.27  		Stop(true);
    1.28 +	}
    1.29  
    1.30  	if (m_ThreadQueue.size())
    1.31 +	{
    1.32  		Flush(true);
    1.33 +	}
    1.34  }
    1.35  
    1.36  void ThreadWorker::OnTerminate(IThreadHandle *pHandle, bool cancel)
    1.37 @@ -62,6 +67,11 @@
    1.38  {
    1.39  	WorkerState this_state = Worker_Running;
    1.40  	size_t num;
    1.41 +
    1.42 +	if (m_pHooks)
    1.43 +	{
    1.44 +		m_pHooks->OnWorkerStart(this);
    1.45 +	}
    1.46      
    1.47  	while (true)
    1.48  	{
    1.49 @@ -112,7 +122,9 @@
    1.50  					if (!m_FlushType)
    1.51  					{
    1.52  						while (m_ThreadQueue.size())
    1.53 +						{
    1.54  							RunFrame();
    1.55 +						}
    1.56  					}
    1.57  					break;
    1.58  				}
    1.59 @@ -127,14 +139,23 @@
    1.60  		 * wait in between threads if specified
    1.61  		 */
    1.62  		if (m_think_time)
    1.63 +		{
    1.64  			m_Threader->ThreadSleep(m_think_time);
    1.65 +		}
    1.66 +	}
    1.67 +
    1.68 +	if (m_pHooks)
    1.69 +	{
    1.70 +		m_pHooks->OnWorkerStop(this);
    1.71  	}
    1.72  }
    1.73  
    1.74  SWThreadHandle *ThreadWorker::PopThreadFromQueue()
    1.75  {
    1.76  	if (m_state <= Worker_Stopped && !m_QueueLock)
    1.77 +	{
    1.78  		return NULL;
    1.79 +	}
    1.80  
    1.81  	SWThreadHandle *swt;
    1.82  	m_QueueLock->Lock();
    1.83 @@ -147,7 +168,9 @@
    1.84  void ThreadWorker::AddThreadToQueue(SWThreadHandle *pHandle)
    1.85  {
    1.86  	if (m_state <= Worker_Stopped)
    1.87 +	{
    1.88  		return;
    1.89 +	}
    1.90  
    1.91  	m_QueueLock->Lock();
    1.92  	BaseWorker::AddThreadToQueue(pHandle);
    1.93 @@ -174,7 +197,9 @@
    1.94  	if (m_state == Worker_Invalid)
    1.95  	{
    1.96  		if (m_Threader == NULL)
    1.97 +		{
    1.98  			return false;
    1.99 +		}
   1.100  	} else if (m_state != Worker_Stopped) {
   1.101  		return false;
   1.102  	}
   1.103 @@ -196,7 +221,9 @@
   1.104  bool ThreadWorker::Stop(bool flush_cancel)
   1.105  {
   1.106  	if (m_state == Worker_Invalid || m_state == Worker_Stopped)
   1.107 +	{
   1.108  		return false;
   1.109 +	}
   1.110  
   1.111  	WorkerState oldstate;
   1.112  
   1.113 @@ -244,7 +271,9 @@
   1.114  bool ThreadWorker::Pause()
   1.115  {
   1.116  	if (m_state != Worker_Running)
   1.117 +	{
   1.118  		return false;
   1.119 +	}
   1.120  
   1.121  	m_StateLock->Lock();
   1.122  	m_state = Worker_Paused;
   1.123 @@ -257,7 +286,9 @@
   1.124  bool ThreadWorker::Unpause()
   1.125  {
   1.126  	if (m_state != Worker_Paused)
   1.127 +	{
   1.128  		return false;
   1.129 +	}
   1.130  
   1.131  	m_StateLock->Lock();
   1.132  	m_state = Worker_Running;