diff thread/AsynchronousTask.h @ 294:2aed32965291

* Fix some locking problems
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 21 May 2009 16:39:35 +0000
parents 2fc2a6768777
children 701233f8ed41
line wrap: on
line diff
--- a/thread/AsynchronousTask.h	Mon May 18 15:44:03 2009 +0000
+++ b/thread/AsynchronousTask.h	Thu May 21 16:39:35 2009 +0000
@@ -12,6 +12,8 @@
 
 #include "Thread.h"
 
+#include <iostream>
+
 /**
  * AsynchronousTask provides a thread pattern implementation for
  * threads which are used to perform a series of similar operations in
@@ -46,8 +48,10 @@
     }
     virtual ~AsynchronousTask()
     {
+        m_todo.lock();
         m_finishing = true;
         m_todo.signal();
+        m_todo.unlock();
         wait();
     }
 
@@ -61,15 +65,14 @@
 
 protected:
     void startTask() {
+        m_done.lock();
         m_todo.lock();
         m_inTask = true;
         m_todo.signal();
-        m_done.lock();
         m_todo.unlock();
     }
     void awaitTask() {
-        m_done.lock();
-        while (m_inTask) m_done.wait();
+        m_done.wait();
         m_done.unlock();
     }
 
@@ -78,20 +81,22 @@
 private:
     virtual void run() {
         m_todo.lock();
-        while (!m_finishing) {
+        while (1) {
             while (!m_inTask && !m_finishing) {
                 m_todo.wait();
             }
             if (m_finishing) {
+                m_done.lock();
                 m_inTask = false;
                 m_done.signal();
+                m_done.unlock();
                 break;
             }
-            if (m_inTask) {
-                performTask();
-                m_inTask = false;
-                m_done.signal();
-            }
+            performTask();
+            m_done.lock();
+            m_inTask = false;
+            m_done.signal();
+            m_done.unlock();
         }
         m_todo.unlock();
     }