aboutsummaryrefslogtreecommitdiff
path: root/lib/base/thread.cpp
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2009-05-18 22:47:43 +0200
committerFelix Domke <tmbinc@elitedvb.net>2009-05-18 22:47:43 +0200
commit8659b61d462dd64b6278f2d6470832f46821cfd5 (patch)
tree995bc9bc294ed75ec6ce6a664be3acd3e134b2db /lib/base/thread.cpp
parentaf91ffbe45ff61ff09761d85dea1e0a17e0309ff (diff)
downloadenigma2-8659b61d462dd64b6278f2d6470832f46821cfd5.tar.gz
enigma2-8659b61d462dd64b6278f2d6470832f46821cfd5.zip
fix 'thread recovery' race with sync() by not abusing m_state.
Diffstat (limited to 'lib/base/thread.cpp')
-rw-r--r--lib/base/thread.cpp11
1 files changed, 5 insertions, 6 deletions
diff --git a/lib/base/thread.cpp b/lib/base/thread.cpp
index 58c4fd72..fa923deb 100644
--- a/lib/base/thread.cpp
+++ b/lib/base/thread.cpp
@@ -9,12 +9,9 @@ void eThread::thread_completed(void *ptr)
eThread *p = (eThread*) ptr;
p->m_alive = 0;
- /* recover state */
- if (!p->m_state.value())
- {
- p->m_state.up();
- ASSERT(p->m_state.value() == 1);
- }
+ /* recover state in case thread was cancelled before calling hasStarted */
+ if (!p->m_started)
+ p->hasStarted();
p->thread_finished();
}
@@ -48,6 +45,7 @@ int eThread::runAsync(int prio, int policy)
ASSERT(m_state.value() == 0);
m_alive = 1;
+ m_started = 0;
/* start thread. */
pthread_attr_t attr;
@@ -125,5 +123,6 @@ void eThread::kill(bool sendcancel)
void eThread::hasStarted()
{
ASSERT(!m_state.value());
+ m_started = 1;
m_state.up();
}