cec: and now proper predicates
[deb_libcec.git] / src / lib / platform / threads / threads.h
index 8fb71fce2b2158382168379054d30750b1e0c4dc..f2de310a23749f7960ef3882008c61e317c5eeb9 100644 (file)
@@ -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,17 +54,21 @@ 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;
@@ -91,7 +96,7 @@ namespace PLATFORM
           if (ThreadsCreate(m_thread, CThread::ThreadHandler, ((void*)static_cast<CThread *>(this))))
           {
             if (bWait)
-              m_threadCondition.Wait(m_threadMutex);
+              m_threadCondition.Wait(m_threadMutex, m_bRunning);
             bReturn = true;
           }
         }
@@ -106,7 +111,6 @@ namespace PLATFORM
         CLockObject lock(m_threadMutex);
         bRunning = IsRunning();
         m_bStop = true;
-        m_threadCondition.Broadcast();
       }
 
       if (bRunning && bWaitForExit)
@@ -120,7 +124,7 @@ namespace PLATFORM
     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;
@@ -129,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<bool &> m_threadCondition;
+    CMutex             m_threadMutex;
+    thread_t           m_thread;
   };
 };