X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fthreads%2Fthreads.h;h=f2de310a23749f7960ef3882008c61e317c5eeb9;hb=ed63a5152ee6f0283fd32d1e304df9e7c7dd03e5;hp=74d683f273fa5056916d47300302f7f8f1f6da2c;hpb=f00ff009cfc5dfefdf09ca241b9560e74575b3f5;p=deb_libcec.git diff --git a/src/lib/platform/threads/threads.h b/src/lib/platform/threads/threads.h index 74d683f..f2de310 100644 --- a/src/lib/platform/threads/threads.h +++ b/src/lib/platform/threads/threads.h @@ -2,7 +2,7 @@ /* * This file is part of the libCEC(R) library. * - * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -40,7 +40,8 @@ namespace PLATFORM public: CThread(void) : m_bStop(false), - m_bRunning(false) {} + m_bRunning(false), + m_bStopped(false) {} virtual ~CThread(void) { @@ -53,51 +54,56 @@ namespace PLATFORM if (thread) { - CLockObject lock(thread->m_threadMutex); - thread->m_bRunning = true; - lock.Unlock(); - thread->m_threadCondition.Broadcast(); + { + CLockObject lock(thread->m_threadMutex); + thread->m_bRunning = true; + thread->m_bStopped = false; + thread->m_threadCondition.Broadcast(); + } retVal = thread->Process(); - lock.Lock(); - thread->m_bRunning = false; - lock.Unlock(); - thread->m_threadCondition.Broadcast(); + { + CLockObject lock(thread->m_threadMutex); + thread->m_bRunning = false; + thread->m_bStopped = true; + thread->m_threadCondition.Broadcast(); + } } return retVal; } - inline bool IsRunning(void) + virtual bool IsRunning(void) { CLockObject lock(m_threadMutex); return m_bRunning; } - inline bool IsStopped(void) + virtual bool IsStopped(void) { CLockObject lock(m_threadMutex); return m_bStop; } - inline bool CreateThread(bool bWait = true) + virtual bool CreateThread(bool bWait = true) { bool bReturn(false); CLockObject lock(m_threadMutex); if (!IsRunning()) { + m_bStop = false; if (ThreadsCreate(m_thread, CThread::ThreadHandler, ((void*)static_cast(this)))) { if (bWait) - m_threadCondition.Wait(m_threadMutex); + m_threadCondition.Wait(m_threadMutex, m_bRunning); bReturn = true; } } return bReturn; } - inline bool StopThread(bool bWaitForExit = true) + virtual bool StopThread(bool bWaitForExit = true) { bool bReturn(true); bool bRunning(false); @@ -105,7 +111,6 @@ namespace PLATFORM CLockObject lock(m_threadMutex); bRunning = IsRunning(); m_bStop = true; - m_threadCondition.Broadcast(); } if (bRunning && bWaitForExit) @@ -116,10 +121,10 @@ namespace PLATFORM return true; } - inline bool Sleep(uint32_t iTimeout) + virtual bool Sleep(uint32_t iTimeout) { CLockObject lock(m_threadMutex); - return m_bStop ? false : m_threadCondition.Wait(m_threadMutex, iTimeout); + return m_bStop ? false : m_threadCondition.Wait(m_threadMutex, m_bStopped, iTimeout); } virtual void *Process(void) = 0; @@ -128,10 +133,11 @@ namespace PLATFORM void SetRunning(bool bSetTo); private: - bool m_bStop; - bool m_bRunning; - CCondition m_threadCondition; - CMutex m_threadMutex; - thread_t m_thread; + bool m_bStop; + bool m_bRunning; + bool m_bStopped; + CCondition m_threadCondition; + CMutex m_threadMutex; + thread_t m_thread; }; };