From 1085a394a4093baf33a5be6fcf2494cd2eb2fa8c Mon Sep 17 00:00:00 2001 From: Thays Grazia Date: Wed, 25 Sep 2019 17:12:33 -0300 Subject: [PATCH] [threading] embedded mono hangs (mono/mono#16907) * [threading] embedded mono hangs When embedded mono is executing a C++ code, it didn't start to execute a C# code, we don't need to suspend the thread to run GC. Fixes mono/mono#16192 Fixes mono/mono#14725 * Changing what was discussed with Aleksey during our 1on1 * Changing what was suggested by Aleksey * Separating mono_init_version that is being used on tests from the embedded ones Commit migrated from https://github.com/mono/mono/commit/5b108b5726ec196f4b61d30f406919ce70211754 --- src/mono/mono/mini/driver.c | 15 +++++++++++++-- src/mono/mono/mini/jit.h | 7 +++++-- src/mono/mono/unit-tests/test-mono-callspec.c | 2 +- src/mono/mono/unit-tests/test-mono-string.c | 2 +- src/mono/mono/utils/mono-threads-api.h | 7 +------ 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/mono/mono/mini/driver.c b/src/mono/mono/mini/driver.c index f5d41bb..06db626 100644 --- a/src/mono/mono/mini/driver.c +++ b/src/mono/mono/mini/driver.c @@ -2754,7 +2754,9 @@ mono_main (int argc, char* argv[]) MonoDomain * mono_jit_init (const char *file) { - return mini_init (file, NULL); + MonoDomain *ret = mini_init (file, NULL); + MONO_ENTER_GC_SAFE_UNBALANCED; //once it is not executing any managed code yet, it's safe to run the gc + return ret; } /** @@ -2780,7 +2782,16 @@ mono_jit_init (const char *file) MonoDomain * mono_jit_init_version (const char *domain_name, const char *runtime_version) { - return mini_init (domain_name, runtime_version); + MonoDomain *ret = mini_init (domain_name, runtime_version); + MONO_ENTER_GC_SAFE_UNBALANCED; //once it is not executing any managed code yet, it's safe to run the gc + return ret; +} + +MonoDomain * +mono_jit_init_version_for_test_only (const char *domain_name, const char *runtime_version) +{ + MonoDomain *ret = mini_init (domain_name, runtime_version); + return ret; } /** diff --git a/src/mono/mono/mini/jit.h b/src/mono/mono/mini/jit.h index 2ada49b..9fc6a18 100644 --- a/src/mono/mono/mini/jit.h +++ b/src/mono/mono/mini/jit.h @@ -13,12 +13,15 @@ MONO_BEGIN_DECLS -MONO_API MonoDomain * +MONO_API MONO_RT_EXTERNAL_ONLY MonoDomain * mono_jit_init (const char *file); -MONO_API MonoDomain * +MONO_API MONO_RT_EXTERNAL_ONLY MonoDomain * mono_jit_init_version (const char *root_domain_name, const char *runtime_version); +MONO_API MonoDomain * +mono_jit_init_version_for_test_only (const char *root_domain_name, const char *runtime_version); + MONO_API int mono_jit_exec (MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); diff --git a/src/mono/mono/unit-tests/test-mono-callspec.c b/src/mono/mono/unit-tests/test-mono-callspec.c index 30b6900..186286c 100644 --- a/src/mono/mono/unit-tests/test-mono-callspec.c +++ b/src/mono/mono/unit-tests/test-mono-callspec.c @@ -192,7 +192,7 @@ test_mono_callspec_main (void) goto out; } - domain = mono_jit_init_version ("TEST RUNNER", "mobile"); + domain = mono_jit_init_version_for_test_only ("TEST RUNNER", "mobile"); assembly = mono_assembly_open (TESTPROG, &status); if (!domain || !assembly) { res = 1; diff --git a/src/mono/mono/unit-tests/test-mono-string.c b/src/mono/mono/unit-tests/test-mono-string.c index 4edda5f..b545486 100644 --- a/src/mono/mono/unit-tests/test-mono-string.c +++ b/src/mono/mono/unit-tests/test-mono-string.c @@ -59,7 +59,7 @@ int test_mono_string_main (void) { - mono_jit_init_version ("test-mono-string", "v4.0.30319"); + mono_jit_init_version_for_test_only ("test-mono-string", "v4.0.30319"); int res = 0; diff --git a/src/mono/mono/utils/mono-threads-api.h b/src/mono/mono/utils/mono-threads-api.h index c8e3410..8315b0c 100644 --- a/src/mono/mono/utils/mono-threads-api.h +++ b/src/mono/mono/utils/mono-threads-api.h @@ -130,13 +130,8 @@ http://www.mono-project.com/docs/advanced/runtime/docs/coop-suspend/#gc-unsafe-m } while (0) #define MONO_ENTER_GC_SAFE_UNBALANCED \ - do { \ MONO_STACKDATA (__gc_safe_unbalanced_dummy); \ - gpointer __gc_safe_unbalanced_cookie = mono_threads_enter_gc_safe_region_unbalanced_internal (&__gc_safe_unbalanced_dummy) - -#define MONO_EXIT_GC_SAFE_UNBALANCED \ - mono_threads_exit_gc_safe_region_unbalanced_internal (__gc_safe_unbalanced_cookie, &__gc_safe_unbalanced_dummy); \ - } while (0) + mono_threads_enter_gc_safe_region_unbalanced_internal (&__gc_safe_unbalanced_dummy) void mono_threads_enter_no_safepoints_region (const char *func); -- 2.7.4