From 12218c56e35aa1bbb0b1239d753fe6676d14d649 Mon Sep 17 00:00:00 2001 From: Vladimir Kargov Date: Tue, 30 Jun 2015 00:15:11 +0300 Subject: [PATCH] [runtime] Fix a crash on Windows during the cleanup phase caused by using a destroyed mutex. --- mono/metadata/gc-internal.h | 1 + mono/metadata/gc.c | 12 +++++++++++- mono/mini/mini-runtime.c | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/mono/metadata/gc-internal.h b/mono/metadata/gc-internal.h index 1511280bd88..d55e56d5d0d 100644 --- a/mono/metadata/gc-internal.h +++ b/mono/metadata/gc-internal.h @@ -84,6 +84,7 @@ MonoBoolean ves_icall_Mono_Runtime_SetGCAllowSynchronousMajor (MonoBoolean flag) extern void mono_gc_init (void); extern void mono_gc_base_init (void); extern void mono_gc_cleanup (void); +extern void mono_gc_mutex_cleanup (void); extern void mono_gc_base_cleanup (void); /* diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c index b69b450bf14..03273531193 100644 --- a/mono/metadata/gc.c +++ b/mono/metadata/gc.c @@ -1275,12 +1275,22 @@ mono_gc_cleanup (void) mono_reference_queue_cleanup (); - mono_mutex_destroy (&handle_section); mono_mutex_destroy (&allocator_section); mono_mutex_destroy (&finalizer_mutex); mono_mutex_destroy (&reference_queue_mutex); } +/** + * mono_gc_mutex_cleanup: + * + * Destroy the mutexes that may still be used after the main cleanup routine. + */ +void +mono_gc_mutex_cleanup (void) +{ + mono_mutex_destroy (&handle_section); +} + gboolean mono_gc_is_finalizer_internal_thread (MonoInternalThread *thread) { diff --git a/mono/mini/mini-runtime.c b/mono/mini/mini-runtime.c index a306f3fdf12..b5976886104 100644 --- a/mono/mini/mini-runtime.c +++ b/mono/mini/mini-runtime.c @@ -3452,6 +3452,7 @@ mini_cleanup (MonoDomain *domain) #ifndef MONO_CROSS_COMPILE mono_domain_free (domain, TRUE); + mono_gc_mutex_cleanup (); #endif #ifdef ENABLE_LLVM -- 2.25.1