]> granicus.if.org Git - gc/commitdiff
Fix pthread_join when thread is registered in thread key destructor
authorIvan Maidanski <ivmai@mail.ru>
Tue, 26 Sep 2017 08:44:44 +0000 (11:44 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Fri, 29 Sep 2017 21:05:28 +0000 (00:05 +0300)
* pthread_support.c (WRAP_FUNC(pthread_join)): Remove assertion that
thread is finished; call GC_delete_gc_thread only if thread is
finished; add comment.
* win32_threads.c [GC_PTHREADS] (GC_pthread_join): Call
GC_delete_gc_thread_no_free and GC_INTERNAL_FREE only if thread is
finished.

pthread_support.c
win32_threads.c

index 2dc9da2b7fcc0ea25dd3cd38ebdc8331e41ca444..d9369e483c90b657f20cc47beefce3a5fff36add 100644 (file)
@@ -1431,9 +1431,11 @@ GC_API int WRAP_FUNC(pthread_join)(pthread_t thread, void **retval)
 # endif
     if (result == 0) {
         LOCK();
-        /* Here the pthread thread id may have been recycled. */
-        GC_ASSERT((t -> flags & FINISHED) != 0);
-        GC_delete_gc_thread(t);
+        /* Here the pthread thread id may have been recycled.           */
+        /* Delete the thread from GC_threads (unless it has been        */
+        /* registered again from the client thread key destructor).     */
+        if ((t -> flags & FINISHED) != 0)
+          GC_delete_gc_thread(t);
         UNLOCK();
     }
     return result;
index 5b757f34f06e5688b1ea3ca22f42792904ba0a82..f8f9954e6430d3aac997e260523c43799bae0b24 100644 (file)
@@ -2501,8 +2501,10 @@ GC_INNER void GC_thr_init(void)
 #     endif
 
       LOCK();
+      if ((t -> flags & FINISHED) != 0) {
         GC_delete_gc_thread_no_free(t);
         GC_INTERNAL_FREE(t);
+      }
       UNLOCK();
     }