]> granicus.if.org Git - gc/commitdiff
Fix GC_suspend_thread for terminated threads
authorIvan Maidanski <ivmai@mail.ru>
Tue, 21 Jun 2016 06:48:21 +0000 (09:48 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 21 Jun 2016 06:48:21 +0000 (09:48 +0300)
* 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.

pthread_stop_world.c
pthread_support.c

index 244731e48d53e93724d9a8dc61c683430067cfea..1ee9ee8f9d4d6e8d1c182dfa1b344868626c7e9f 100644 (file)
@@ -433,8 +433,9 @@ STATIC void GC_restart_handler(int sig)
       /* 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:
index d9f935f766d6122c47cd85131cf516fa4d542353..d0c9cb1034b5b696aac25f0a9867be36304d57f8 100644 (file)
@@ -1617,6 +1617,7 @@ GC_API int GC_CALL GC_register_my_thread(const struct GC_stack_base *sb)
     } 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