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;