Mercurial > hg > qm-dsp
comparison thread/AsynchronousTask.h @ 293:2fc2a6768777
* Fix race condition
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Mon, 18 May 2009 15:44:03 +0000 |
parents | b97f4f926f48 |
children | 6afa0e011f74 |
comparison
equal
deleted
inserted
replaced
292:b97f4f926f48 | 293:2fc2a6768777 |
---|---|
66 m_todo.signal(); | 66 m_todo.signal(); |
67 m_done.lock(); | 67 m_done.lock(); |
68 m_todo.unlock(); | 68 m_todo.unlock(); |
69 } | 69 } |
70 void awaitTask() { | 70 void awaitTask() { |
71 m_done.lock(); | |
71 while (m_inTask) m_done.wait(); | 72 while (m_inTask) m_done.wait(); |
72 m_done.unlock(); | 73 m_done.unlock(); |
73 } | 74 } |
74 | 75 |
75 virtual void performTask() = 0; | 76 virtual void performTask() = 0; |
80 while (!m_finishing) { | 81 while (!m_finishing) { |
81 while (!m_inTask && !m_finishing) { | 82 while (!m_inTask && !m_finishing) { |
82 m_todo.wait(); | 83 m_todo.wait(); |
83 } | 84 } |
84 if (m_finishing) { | 85 if (m_finishing) { |
86 m_inTask = false; | |
87 m_done.signal(); | |
85 break; | 88 break; |
86 } | 89 } |
87 if (m_inTask) { | 90 if (m_inTask) { |
88 performTask(); | 91 performTask(); |
89 m_inTask = false; | 92 m_inTask = false; |