(a cherry-pick of commit
8e646005 from 'master')
* include/private/gc_priv.h [GC_PTHREADS && !GC_WIN32_THREADS]
(GC_in_thread_creation): Move variable declaration from
pthread_support.h.
* misc.c [!DONT_USE_ATEXIT && GC_PTHREADS && !GC_WIN32_THREADS]
(GC_exit_check): Set GC_in_thread_creation to TRUE before GC_gcollect
call.
#define GC_gcollect_inner() \
(void)GC_try_to_collect_inner(GC_never_stop_func)
+#if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS)
+ GC_EXTERN GC_bool GC_in_thread_creation;
+ /* We may currently be in thread creation or destruction. */
+ /* Only set to TRUE while allocation lock is held. */
+ /* When set, it is OK to run GC from unknown thread. */
+#endif
+
GC_EXTERN GC_bool GC_is_initialized; /* GC_init() has been run. */
#if defined(MSWIN32) || defined(MSWINCE)
GC_INNER GC_thread GC_lookup_thread(pthread_t id);
-GC_EXTERN GC_bool GC_in_thread_creation;
- /* We may currently be in thread creation or destruction. */
- /* Only set to TRUE while allocation lock is held. */
- /* When set, it is OK to run GC from unknown thread. */
-
#ifdef NACL
GC_EXTERN __thread GC_thread GC_nacl_gc_thread_self;
GC_INNER void GC_nacl_initialize_gc_thread(void);
STATIC void GC_exit_check(void)
{
if (GC_find_leak) {
- GC_gcollect();
+# if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS)
+ GC_in_thread_creation = TRUE; /* OK to collect from unknown thread. */
+ GC_gcollect();
+ GC_in_thread_creation = FALSE;
+# else
+ GC_gcollect();
+# endif
}
}
#endif