From 2057b115b5bfe9cac063c93ace3e8d60793ae560 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Tue, 26 Sep 2017 11:44:44 +0300 Subject: [PATCH] Fix pthread_join when thread is registered in thread key destructor * 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 | 8 +++++--- win32_threads.c | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pthread_support.c b/pthread_support.c index 2694ec80..2fdcbb8b 100644 --- a/pthread_support.c +++ b/pthread_support.c @@ -1516,9 +1516,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; diff --git a/win32_threads.c b/win32_threads.c index b822dcd2..e89c0b1a 100644 --- a/win32_threads.c +++ b/win32_threads.c @@ -2559,8 +2559,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(); } -- 2.40.0