# HG changeset patch # User Chris Cannam # Date 1242923975 0 # Node ID 2aed3296529127a27fc4fce6c9ced2e6a415e64d # Parent 2fc2a676877704ad0324e8c7e36434d49dd17b4f * Fix some locking problems diff -r 2fc2a6768777 -r 2aed32965291 thread/AsynchronousTask.h --- 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 + /** * 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(); } diff -r 2fc2a6768777 -r 2aed32965291 thread/Thread.cpp --- 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