X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/62a59db2e74147b3b8edeeefbf0ebb64afe0311c..10f779bd487379e0a9aec80e586c562e2ac71273:/lib/base/thread.cpp diff --git a/lib/base/thread.cpp b/lib/base/thread.cpp index db6deb35..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(); } @@ -45,8 +42,10 @@ int eThread::runAsync(int prio, int policy) ASSERT(m_state.value() == 1); /* sync postconditions */ ASSERT(!m_alive); m_state.down(); + ASSERT(m_state.value() == 0); m_alive = 1; + m_started = 0; /* start thread. */ pthread_attr_t attr; @@ -88,8 +87,11 @@ eThread::~eThread() int eThread::sync(void) { int res; + int debug_val_before = m_state.value(); m_state.down(); /* this might block */ res = m_alive; + if (m_state.value() != 0) + eFatal("eThread::sync: m_state.value() == %d - was %d before", m_state.value(), debug_val_before); ASSERT(m_state.value() == 0); m_state.up(); return res; /* 0: thread is guaranteed not to run. 1: state unknown. */ @@ -121,5 +123,6 @@ void eThread::kill(bool sendcancel) void eThread::hasStarted() { ASSERT(!m_state.value()); + m_started = 1; m_state.up(); }