[threading] embedded mono hangs (mono/mono#16907)
authorThays Grazia <thaystg@gmail.com>
Wed, 25 Sep 2019 20:12:33 +0000 (17:12 -0300)
committerGitHub <noreply@github.com>
Wed, 25 Sep 2019 20:12:33 +0000 (17:12 -0300)
* [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
src/mono/mono/mini/jit.h
src/mono/mono/unit-tests/test-mono-callspec.c
src/mono/mono/unit-tests/test-mono-string.c
src/mono/mono/utils/mono-threads-api.h

index f5d41bb..06db626 100644 (file)
@@ -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;
 }
 
 /**
index 2ada49b..9fc6a18 100644 (file)
 
 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[]);
index 30b6900..186286c 100644 (file)
@@ -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;
index 4edda5f..b545486 100644 (file)
@@ -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;
 
index c8e3410..8315b0c 100644 (file)
@@ -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);