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();
}
ASSERT(m_state.value() == 0);
m_alive = 1;
+ m_started = 0;
/* start thread. */
pthread_attr_t attr;
void eThread::hasStarted()
{
ASSERT(!m_state.value());
+ m_started = 1;
m_state.up();
}
pthread_t the_thread;
static void *wrapper(void *ptr);
- int m_alive;
+ int m_alive, m_started;
static void thread_completed(void *p);
eSemaphore m_state;