* pthread_stop_world.c (GC_suspend_thread): Do not clear
SUSPENDED_EXT flag in case of RAISE_SIGNAL() failure, add assertion
about FINISHED (in case of ESRCH), update comment.
* pthread_stop_world.c (GC_register_my_thread): Add assertion
that SUSPENDED_EXT flag is not set if the thread is registered from
a thread key destructor.
/* TODO: Support GC_retry_signals */
switch (RAISE_SIGNAL(t, GC_sig_suspend)) {
case ESRCH:
- /* Not really there anymore. Possible? */
- t -> flags &= ~SUSPENDED_EXT;
+ /* Not really there anymore (terminated but not joined yet). */
+ /* No need to wait but leave the suspension flag on. */
+ GC_ASSERT((t -> flags & FINISHED) != 0);
UNLOCK();
return;
case 0:
} else if ((me -> flags & FINISHED) != 0) {
/* This code is executed when a thread is registered from the */
/* client thread key destructor. */
+ GC_ASSERT((me -> flags & SUSPENDED_EXT) == 0);
GC_record_stack_base(me, sb);
me -> flags &= ~FINISHED; /* but not DETACHED */
# ifdef GC_EXPLICIT_SIGNALS_UNBLOCK