Reduce risk of problems cleaning thread state
Leak a small amount of memory when there are still application threads around, that's slightly less problematic than the old code. It really needs an overhaul. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
705b03cf09
commit
c0aad847fb
1 changed files with 18 additions and 10 deletions
|
@ -102,17 +102,25 @@ void thread_states_init (unsigned maxthreads)
|
||||||
|
|
||||||
void thread_states_fini (void)
|
void thread_states_fini (void)
|
||||||
{
|
{
|
||||||
|
/* Some applications threads that, at some point, required a thread state, may still be around.
|
||||||
|
Of those, the cleanup routine is invoked when the thread terminates. This should be rewritten
|
||||||
|
to not rely on this global thing and with each thread owning its own bit state, e.g., linked
|
||||||
|
together in a list to give the GC access to it. Until then, we can't release these resources
|
||||||
|
if there are still users. */
|
||||||
|
uint32_t others = 0;
|
||||||
|
ddsrt_mutex_lock (&thread_states.lock);
|
||||||
for (uint32_t i = 0; i < thread_states.nthreads; i++)
|
for (uint32_t i = 0; i < thread_states.nthreads; i++)
|
||||||
|
{
|
||||||
assert (thread_states.ts[i].state != THREAD_STATE_ALIVE);
|
assert (thread_states.ts[i].state != THREAD_STATE_ALIVE);
|
||||||
ddsrt_mutex_destroy (&thread_states.lock);
|
others += (thread_states.ts[i].state == THREAD_STATE_LAZILY_CREATED);
|
||||||
ddsrt_free_aligned (thread_states.ts);
|
}
|
||||||
|
ddsrt_mutex_unlock (&thread_states.lock);
|
||||||
/* All spawned threads are gone, but the main thread is still alive,
|
if (others == 0)
|
||||||
downgraded to an ordinary thread (we're on it right now). We
|
{
|
||||||
don't want to lose the ability to log messages, so set ts to a
|
ddsrt_mutex_destroy (&thread_states.lock);
|
||||||
NULL pointer and rely on lookup_thread_state()'s checks
|
ddsrt_free_aligned (thread_states.ts);
|
||||||
thread_states.ts. */
|
thread_states.ts = NULL;
|
||||||
thread_states.ts = NULL;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ddsrt_attribute_no_sanitize (("thread"))
|
ddsrt_attribute_no_sanitize (("thread"))
|
||||||
|
@ -121,7 +129,7 @@ static struct thread_state1 *find_thread_state (ddsrt_thread_t tid)
|
||||||
if (thread_states.ts) {
|
if (thread_states.ts) {
|
||||||
for (uint32_t i = 0; i < thread_states.nthreads; i++)
|
for (uint32_t i = 0; i < thread_states.nthreads; i++)
|
||||||
{
|
{
|
||||||
if (ddsrt_thread_equal (thread_states.ts[i].tid, tid))
|
if (ddsrt_thread_equal (thread_states.ts[i].tid, tid) && thread_states.ts[i].state != THREAD_STATE_ZERO)
|
||||||
return &thread_states.ts[i];
|
return &thread_states.ts[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue