From 971eba81ac3b150f806f5414e10ae4808ebf92ad Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Fri, 6 Dec 2013 15:23:02 -0500 Subject: [PATCH] [sgen]Fix a deadlock when the GC try to free a JI during world restart. Fixes #15759 This is deadlock prone as the GC lock is a leaf lock while the domain lock required to free a JI is not. There are plenty of places where we alloc memory while holding the domain lock, so we cannot do it the other way. --- mono/metadata/sgen-gc.c | 8 +++++++- mono/metadata/sgen-gc.h | 6 ++---- mono/metadata/sgen-stw.c | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 0c0b15b75da..95f263c1c59 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -401,6 +401,7 @@ sgen_safe_name (void* obj) * ###################################################################### */ LOCK_DECLARE (gc_mutex); +gboolean sgen_try_free_some_memory; #define SCAN_START_SIZE SGEN_SCAN_START_SIZE @@ -5597,7 +5598,12 @@ sgen_gc_lock (void) void sgen_gc_unlock (void) { - UNLOCK_GC; + gboolean try_free = sgen_try_free_some_memory; + sgen_try_free_some_memory = FALSE; + mono_mutex_unlock (&gc_mutex); + MONO_GC_UNLOCKED (); + if (try_free) + mono_thread_hazardous_try_free_some (); } void diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index 9f5902ea268..15afdbcd03a 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -158,10 +158,7 @@ struct _GCMemSection { MONO_GC_LOCKED (); \ } while (0) #define TRYLOCK_GC (mono_mutex_trylock (&gc_mutex) == 0) -#define UNLOCK_GC do { \ - mono_mutex_unlock (&gc_mutex); \ - MONO_GC_UNLOCKED (); \ - } while (0) +#define UNLOCK_GC do { sgen_gc_unlock (); } while (0) extern LOCK_DECLARE (sgen_interruption_mutex); @@ -979,6 +976,7 @@ extern int degraded_mode; extern int default_nursery_size; extern guint32 tlab_size; extern NurseryClearPolicy nursery_clear_policy; +extern gboolean sgen_try_free_some_memory; extern LOCK_DECLARE (gc_mutex); diff --git a/mono/metadata/sgen-stw.c b/mono/metadata/sgen-stw.c index 0f52505544c..54dc218b584 100755 --- a/mono/metadata/sgen-stw.c +++ b/mono/metadata/sgen-stw.c @@ -277,7 +277,7 @@ sgen_restart_world (int generation, GGTimingInfo *timing) */ release_gc_locks (); - mono_thread_hazardous_try_free_some (); + sgen_try_free_some_memory = TRUE; sgen_bridge_processing_finish (generation); -- 2.25.1