From: Ivan Maidanski Date: Tue, 26 Sep 2017 08:44:44 +0000 (+0300) Subject: Fix pthread_join when thread is registered in thread key destructor X-Git-Tag: v8.0.0~571 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2057b115b5bfe9cac063c93ace3e8d60793ae560;p=platform%2Fupstream%2Flibgc.git 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. --- diff --git a/pthread_support.c b/pthread_support.c index 2694ec8..2fdcbb8 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 b822dcd..e89c0b1 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(); }