#include <stdio.h>
#include <unistd.h>
-#include <assert.h>
#include <lib/base/eerror.h>
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();
}
return -1;
eDebug("after: %d", m_state.value());
- assert(m_state.value() == 1); /* sync postconditions */
- assert(!m_alive);
+ 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;
pthread_attr_setschedpolicy(&attr, policy);
pthread_attr_setschedparam(&attr, &p);
}
-
+
+ if (the_thread) {
+ eDebug("old thread joined %d", pthread_join(the_thread, 0));
+ the_thread = 0;
+ }
+
if (pthread_create(&the_thread, &attr, wrapper, this))
{
pthread_attr_destroy(&attr);
pthread_attr_destroy(&attr);
return 0;
-}
+}
int eThread::run(int prio, int policy)
{
int eThread::sync(void)
{
int res;
+ int debug_val_before = m_state.value();
m_state.down(); /* this might block */
res = m_alive;
- assert(m_state.value() == 0);
+ 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. */
}
void eThread::hasStarted()
{
- assert(!m_state.value());
+ ASSERT(!m_state.value());
+ m_started = 1;
m_state.up();
}