core/thread/BaseWorker.cpp
changeset 1090 5c54e353c019
parent 1084 241c1b9b4048
child 1231 17badaf66ce4
     1.1 --- a/core/thread/BaseWorker.cpp	Thu Jul 12 02:57:43 2007 +0000
     1.2 +++ b/core/thread/BaseWorker.cpp	Thu Jul 12 16:57:26 2007 +0000
     1.3 @@ -14,9 +14,10 @@
     1.4  
     1.5  #include "BaseWorker.h"
     1.6  
     1.7 -BaseWorker::BaseWorker() : 
     1.8 +BaseWorker::BaseWorker(IThreadWorkerCallbacks *hooks) : 
     1.9  	m_perFrame(SM_DEFAULT_THREADS_PER_FRAME),
    1.10 -	m_state(Worker_Stopped)
    1.11 +	m_state(Worker_Stopped),
    1.12 +	m_pHooks(hooks)
    1.13  {
    1.14  }
    1.15  
    1.16 @@ -129,14 +130,18 @@
    1.17  	while (done < max)
    1.18  	{
    1.19  		if ((swt=PopThreadFromQueue()) == NULL)
    1.20 +		{
    1.21  			break;
    1.22 +		}
    1.23  		pThread = swt->pThread;
    1.24  		swt->m_state = Thread_Running;
    1.25  		pThread->RunThread(swt);
    1.26  		swt->m_state = Thread_Done;
    1.27  		pThread->OnTerminate(swt, false);
    1.28  		if (swt->m_params.flags & Thread_AutoRelease)
    1.29 +		{
    1.30  			delete swt;
    1.31 +		}
    1.32  		done++;
    1.33  	}
    1.34  
    1.35 @@ -157,30 +162,46 @@
    1.36  
    1.37  	m_state = Worker_Running;
    1.38  
    1.39 +	if (m_pHooks)
    1.40 +	{
    1.41 +		m_pHooks->OnWorkerStart(this);
    1.42 +	}
    1.43 +
    1.44      return true;
    1.45  }
    1.46  
    1.47  bool BaseWorker::Stop(bool flush_cancel)
    1.48  {
    1.49  	if (m_state == Worker_Invalid || m_state == Worker_Stopped)
    1.50 +	{
    1.51  		return false;
    1.52 +	}
    1.53  
    1.54  	if (m_state == Worker_Paused)
    1.55  	{
    1.56  		if (!Unpause())
    1.57 +		{
    1.58  			return false;
    1.59 +		}
    1.60  	}
    1.61  
    1.62  	m_state = Worker_Stopped;
    1.63  	Flush(flush_cancel);
    1.64  
    1.65 +	if (m_pHooks)
    1.66 +	{
    1.67 +		m_pHooks->OnWorkerStop(this);
    1.68 +	}
    1.69 +
    1.70  	return true;
    1.71  }
    1.72  
    1.73  bool BaseWorker::Pause()
    1.74  {
    1.75  	if (m_state != Worker_Running)
    1.76 +	{
    1.77  		return false;
    1.78 +	}
    1.79  
    1.80  	m_state = Worker_Paused;
    1.81  
    1.82 @@ -191,7 +212,9 @@
    1.83  bool BaseWorker::Unpause()
    1.84  {
    1.85  	if (m_state != Worker_Paused)
    1.86 +	{
    1.87  		return false;
    1.88 +	}
    1.89  
    1.90  	m_state = Worker_Running;
    1.91