mscoree: Call mono_thread_manage in GC Unsafe mode.

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@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Vincent Povirk 2019-10-24 16:00:52 -05:00 committed by Alexandre Julliard
parent 227c47e7a0
commit d10f2c0723
3 changed files with 5 additions and 0 deletions

View File

@ -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();
}

View File

@ -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

View File

@ -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;