Fix threadloop
* joining must be done inside the loop, doh * a thread must release itself first in the loop, new threads have to go idle when created
This commit is contained in:
parent
cd39533899
commit
32217debe8
1 changed files with 17 additions and 12 deletions
|
|
@ -92,15 +92,15 @@ thread_loop (void* thread)
|
||||||
t->rh = &lumiera_lock_section_.rh;
|
t->rh = &lumiera_lock_section_.rh;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
lumiera_threadpool_release_thread(t);
|
||||||
|
LUMIERA_CONDITION_WAIT (t->state != LUMIERA_THREADSTATE_IDLE);
|
||||||
|
INFO (threads, "Thread awaken with state %d", t->state);
|
||||||
|
|
||||||
// NULL function means: no work to do
|
// NULL function means: no work to do
|
||||||
INFO (threads, "function %p", t->function);
|
INFO (threads, "function %p", t->function);
|
||||||
if (t->function)
|
if (t->function)
|
||||||
t->function (t->arguments);
|
t->function (t->arguments);
|
||||||
lumiera_threadpool_release_thread(t);
|
TRACE (threads, "function done");
|
||||||
LUMIERA_CONDITION_WAIT (t->state != LUMIERA_THREADSTATE_IDLE);
|
|
||||||
INFO (threads, "Thread awaken with state %d", t->state);
|
|
||||||
} while (t->state != LUMIERA_THREADSTATE_SHUTDOWN);
|
|
||||||
// SHUTDOWN state
|
|
||||||
|
|
||||||
if (t->kind & LUMIERA_THREAD_JOINABLE)
|
if (t->kind & LUMIERA_THREAD_JOINABLE)
|
||||||
{
|
{
|
||||||
|
|
@ -108,10 +108,15 @@ thread_loop (void* thread)
|
||||||
/* move error state to data the other thread will it pick up from there */
|
/* move error state to data the other thread will it pick up from there */
|
||||||
t->arguments = (void*)lumiera_error ();
|
t->arguments = (void*)lumiera_error ();
|
||||||
t->state = LUMIERA_THREADSTATE_ZOMBIE;
|
t->state = LUMIERA_THREADSTATE_ZOMBIE;
|
||||||
|
LUMIERA_CONDITION_SIGNAL;
|
||||||
LUMIERA_CONDITION_WAIT (t->state == LUMIERA_THREADSTATE_JOINED);
|
LUMIERA_CONDITION_WAIT (t->state == LUMIERA_THREADSTATE_JOINED);
|
||||||
INFO (threads, "Thread joined");
|
INFO (threads, "Thread joined");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} while (t->state != LUMIERA_THREADSTATE_SHUTDOWN);
|
||||||
|
// SHUTDOWN state
|
||||||
|
|
||||||
|
|
||||||
INFO (threads, "Thread Shutdown");
|
INFO (threads, "Thread Shutdown");
|
||||||
}
|
}
|
||||||
TODO ("no error must be pending here, else do app shutdown");
|
TODO ("no error must be pending here, else do app shutdown");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue