* [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
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;
}
/**
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;
}
/**
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[]);
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;
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;
} 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);