changeset 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 1c9258dd155e
files thread/AsynchronousTask.h thread/Thread.cpp
diffstat 2 files changed, 16 insertions(+), 21 deletions(-) [+]
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();
     }
--- a/thread/Thread.cpp	Mon May 18 15:44:03 2009 +0000
+++ b/thread/Thread.cpp	Thu May 21 16:39:35 2009 +0000
@@ -207,12 +207,6 @@
 void
 Condition::lock()
 {
-    if (m_locked) {
-#ifdef DEBUG_CONDITION
-        cerr << "CONDITION DEBUG: " << (void *)GetCurrentThreadId() << ": Already locked " << &m_condition << " \"" << m_name << "\"" << endl;
-#endif
-        return;
-    }
 #ifdef DEBUG_CONDITION
     cerr << "CONDITION DEBUG: " << (void *)GetCurrentThreadId() << ": Want to lock " << &m_condition << " \"" << m_name << "\"" << endl;
 #endif
@@ -468,12 +462,6 @@
 void
 Condition::lock()
 {
-    if (m_locked) {
-#ifdef DEBUG_CONDITION
-        cerr << "CONDITION DEBUG: " << (void *)pthread_self() << ": Already locked " << &m_condition << " \"" << m_name << "\"" << endl;
-#endif
-        return;
-    }
 #ifdef DEBUG_CONDITION
     cerr << "CONDITION DEBUG: " << (void *)pthread_self() << ": Want to lock " << &m_condition << " \"" << m_name << "\"" << endl;
 #endif
@@ -534,6 +522,8 @@
 #ifdef DEBUG_CONDITION
     cerr << "CONDITION DEBUG: " << (void *)pthread_self() << ": Wait done on " << &m_condition << " \"" << m_name << "\"" << endl;
 #endif
+
+    m_locked = true;
 }
 
 void