[PATCH] mscoree: Call mono_thread_manage in GC Unsafe mode.

Vincent Povirk vincent at codeweavers.com
Thu Oct 24 16:00:52 CDT 2019


The mono_thread_manage API expects to be called in GC Unsafe mode.

This has been the case for a while, but for some reason it only
caused problems in the Mono merge I'm working on now.

We don't need a matching exit call because we're shutting down
the runtime anyway, and we can't change GC modes after the runtime
shuts down.

Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
---
 dlls/mscoree/corruntimehost.c  | 2 ++
 dlls/mscoree/metahost.c        | 2 ++
 dlls/mscoree/mscoree_private.h | 1 +
 3 files changed, 5 insertions(+)

diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c
index e932a7f58be..b72af709c03 100644
--- a/dlls/mscoree/corruntimehost.c
+++ b/dlls/mscoree/corruntimehost.c
@@ -1544,6 +1544,8 @@ __int32 WINAPI _CorExeMain(void)
 
     if (domain)
     {
+        int dummy;
+        mono_threads_enter_gc_unsafe_region(&dummy);
         mono_thread_manage();
         mono_runtime_quit();
     }
diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c
index 18232a45686..575d6ce1d39 100644
--- a/dlls/mscoree/metahost.c
+++ b/dlls/mscoree/metahost.c
@@ -124,6 +124,7 @@ MonoString* (CDECL *mono_string_new)(MonoDomain *domain, const char *str);
 static char* (CDECL *mono_stringify_assembly_name)(MonoAssemblyName *aname);
 MonoThread* (CDECL *mono_thread_attach)(MonoDomain *domain);
 void (CDECL *mono_thread_manage)(void);
+void (CDECL *mono_threads_enter_gc_unsafe_region)(void *stackdata);
 void (CDECL *mono_trace_set_print_handler)(MonoPrintCallback callback);
 void (CDECL *mono_trace_set_printerr_handler)(MonoPrintCallback callback);
 
@@ -224,6 +225,7 @@ static HRESULT load_mono(LPCWSTR mono_path)
         LOAD_MONO_FUNCTION(mono_string_new);
         LOAD_MONO_FUNCTION(mono_thread_attach);
         LOAD_MONO_FUNCTION(mono_thread_manage);
+        LOAD_MONO_FUNCTION(mono_threads_enter_gc_unsafe_region);
 
 #undef LOAD_MONO_FUNCTION
 
diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h
index 2b9c1dd35e5..250bd24ad10 100644
--- a/dlls/mscoree/mscoree_private.h
+++ b/dlls/mscoree/mscoree_private.h
@@ -177,6 +177,7 @@ extern void (CDECL *mono_runtime_quit)(void) DECLSPEC_HIDDEN;
 extern MonoString* (CDECL *mono_string_new)(MonoDomain *domain, const char *str) DECLSPEC_HIDDEN;
 extern MonoThread* (CDECL *mono_thread_attach)(MonoDomain *domain) DECLSPEC_HIDDEN;
 extern void (CDECL *mono_thread_manage)(void) DECLSPEC_HIDDEN;
+extern void (CDECL *mono_threads_enter_gc_unsafe_region)(void *stackdata) DECLSPEC_HIDDEN;
 extern void (CDECL *mono_trace_set_print_handler)(MonoPrintCallback callback) DECLSPEC_HIDDEN;
 extern void (CDECL *mono_trace_set_printerr_handler)(MonoPrintCallback callback) DECLSPEC_HIDDEN;
 
-- 
2.17.1




More information about the wine-devel mailing list