Mercurial > hg > qm-dsp
comparison thread/AsynchronousTask.h @ 68:09aba2ccd94a
* Fix race condition
author | cannam |
---|---|
date | Mon, 18 May 2009 15:44:03 +0000 |
parents | 516c86946900 |
children | 6afa0e011f74 |
comparison
equal
deleted
inserted
replaced
67:516c86946900 | 68:09aba2ccd94a |
---|---|
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; |