* Revert "[threads] Fix leaking threads: SGen Worker and Finalizer (#5284)"
The sgen-specific cleanup cannot be run before the sgen-agnostic cleanup
This reverts commit
7db0fb0c886f5157066e26c2e2ae2d39c338cf6b.
* [threads] Make sure we do not leak the finalizer and sgen threadpool threads
return;
if (!gc_disabled) {
return;
if (!gc_disabled) {
-
- /* Stop all worker threads before signalling the finalizer to stop
- * That way the finalizer has a chance to clean up the worker threads */
- mono_gc_base_cleanup ();
-
finished = TRUE;
if (mono_thread_internal_current () != gc_thread) {
int ret;
finished = TRUE;
if (mono_thread_internal_current () != gc_thread) {
int ret;
ret = guarded_wait (gc_thread->handle, MONO_INFINITE_WAIT, FALSE);
g_assert (ret == MONO_THREAD_INFO_WAIT_RET_SUCCESS_0);
ret = guarded_wait (gc_thread->handle, MONO_INFINITE_WAIT, FALSE);
g_assert (ret == MONO_THREAD_INFO_WAIT_RET_SUCCESS_0);
- /* Clean up the finalizer (and other threads that might still wait to be joined) */
- mono_threads_join_threads ();
+ mono_threads_add_joinable_thread (GUINT_TO_POINTER (gc_thread->tid));
g_assert (ret == MONO_THREAD_INFO_WAIT_RET_SUCCESS_0);
g_assert (ret == MONO_THREAD_INFO_WAIT_RET_SUCCESS_0);
- /* Clean up the finalizer (and other threads that might still wait to be joined) */
- mono_threads_join_threads ();
+ mono_threads_add_joinable_thread (GUINT_TO_POINTER (gc_thread->tid));
+ mono_gc_base_cleanup ();
}
mono_reference_queue_cleanup ();
}
mono_reference_queue_cleanup ();
void
mono_thread_cleanup (void)
{
void
mono_thread_cleanup (void)
{
+ mono_threads_join_threads ();
+
#if !defined(RUN_IN_SUBTHREAD) && !defined(HOST_WIN32)
/* The main thread must abandon any held mutexes (particularly
* important for named mutexes as they are shared across
#if !defined(RUN_IN_SUBTHREAD) && !defined(HOST_WIN32)
/* The main thread must abandon any held mutexes (particularly
* important for named mutexes as they are shared across