From: Vlad Brezae Date: Tue, 25 Jun 2019 15:43:25 +0000 (+0300) Subject: [interp] Reduce computation under calc_section mutex X-Git-Tag: submit/tizen/20210909.063632~10331^2~5^2~1070 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=90f1a8e004a836377e8974ecd6d5809b8b5a1e74;p=platform%2Fupstream%2Fdotnet%2Fruntime.git [interp] Reduce computation under calc_section mutex Calc_section mutex is meant to be a lower level mutex used only for synchronization on InterpMethod contents. Before this commit we were taking the loader mutex which was leading to deadlocks. Commit migrated from https://github.com/mono/mono/commit/aa05d4f43c127a3d34aeb5e7b8ece58a452aa7e3 --- diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index cc1fdeb..4c8c8e1 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -6124,9 +6124,7 @@ mono_interp_transform_method (InterpMethod *imethod, ThreadContext *context, Mon if (method->iflags & (METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL | METHOD_IMPL_ATTRIBUTE_RUNTIME)) { MonoMethod *nm = NULL; - mono_os_mutex_lock (&calc_section); if (imethod->transformed) { - mono_os_mutex_unlock (&calc_section); MONO_PROFILER_RAISE (jit_done, (method, imethod->jinfo)); return; } @@ -6160,16 +6158,17 @@ mono_interp_transform_method (InterpMethod *imethod, ThreadContext *context, Mon g_assert_not_reached (); } if (nm == NULL) { + mono_os_mutex_lock (&calc_section); imethod->stack_size = sizeof (stackval); /* for tracing */ imethod->alloca_size = imethod->stack_size; + mono_memory_barrier (); imethod->transformed = TRUE; - mono_os_mutex_unlock(&calc_section); + mono_os_mutex_unlock (&calc_section); MONO_PROFILER_RAISE (jit_done, (method, NULL)); return; } method = nm; header = interp_method_get_header (nm, error); - mono_os_mutex_unlock (&calc_section); return_if_nok (error); }