Mercurial > hg > qm-dsp
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