Vincent Povirk : mscoree: Call Mono's System.Environment. Exit instead of duplicating it.
Alexandre Julliard
julliard at winehq.org
Fri Oct 25 10:57:55 CDT 2013
Module: wine
Branch: master
Commit: 5e81bad2395b17c7f4d3697ceb76f363ef38a940
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e81bad2395b17c7f4d3697ceb76f363ef38a940
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu Oct 24 16:01:11 2013 -0500
mscoree: Call Mono's System.Environment.Exit instead of duplicating it.
---
dlls/mscoree/corruntimehost.c | 54 +++++++++++++++++++++++++++++++++++++++
dlls/mscoree/metahost.c | 55 ++++++++++-----------------------------
dlls/mscoree/mscoree_main.c | 3 +-
dlls/mscoree/mscoree_private.h | 6 +++-
4 files changed, 73 insertions(+), 45 deletions(-)
diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c
index 4ae85b9..5cea669 100644
--- a/dlls/mscoree/corruntimehost.c
+++ b/dlls/mscoree/corruntimehost.c
@@ -214,6 +214,60 @@ static HRESULT RuntimeHost_GetIUnknownForDomain(RuntimeHost *This, MonoDomain *d
return hr;
}
+void RuntimeHost_ExitProcess(RuntimeHost *This, INT exitcode)
+{
+ HRESULT hr;
+ void *args[2];
+ MonoDomain *domain;
+ MonoAssembly *assembly;
+ MonoImage *image;
+ MonoClass *klass;
+ MonoMethod *method;
+
+ hr = RuntimeHost_GetDefaultDomain(This, &domain);
+ if (FAILED(hr))
+ {
+ ERR("Cannot get domain, hr=%x\n", hr);
+ return;
+ }
+
+ mono_thread_attach(domain);
+
+ assembly = mono_domain_assembly_open(domain, "mscorlib");
+ if (!assembly)
+ {
+ ERR("Cannot load mscorlib\n");
+ return;
+ }
+
+ image = mono_assembly_get_image(assembly);
+ if (!image)
+ {
+ ERR("Couldn't get assembly image\n");
+ return;
+ }
+
+ klass = mono_class_from_name(image, "System", "Environment");
+ if (!klass)
+ {
+ ERR("Couldn't get class from image\n");
+ return;
+ }
+
+ method = mono_class_get_method_from_name(klass, "Exit", 0);
+ if (!method)
+ {
+ ERR("Couldn't get method from class\n");
+ return;
+ }
+
+ args[0] = &exitcode;
+ args[1] = NULL;
+ mono_runtime_invoke(method, NULL, args, NULL);
+
+ ERR("Process should have exited\n");
+}
+
static inline RuntimeHost *impl_from_ICLRRuntimeHost( ICLRRuntimeHost *iface )
{
return CONTAINING_RECORD(iface, RuntimeHost, ICLRRuntimeHost_iface);
diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c
index de1d004..4264f3a 100644
--- a/dlls/mscoree/metahost.c
+++ b/dlls/mscoree/metahost.c
@@ -100,17 +100,12 @@ static void (CDECL *mono_profiler_install)(MonoProfiler *prof, MonoProfileFunc s
MonoType* (CDECL *mono_reflection_type_from_name)(char *name, MonoImage *image);
MonoObject* (CDECL *mono_runtime_invoke)(MonoMethod *method, void *obj, void **params, MonoObject **exc);
void (CDECL *mono_runtime_object_init)(MonoObject *this_obj);
-static void (CDECL *mono_runtime_quit)(void);
-static void (CDECL *mono_runtime_set_shutting_down)(void);
static void (CDECL *mono_set_dirs)(const char *assembly_dir, const char *config_dir);
static void (CDECL *mono_set_verbose_level)(DWORD level);
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);
-static void (CDECL *mono_thread_pool_cleanup)(void);
-static void (CDECL *mono_thread_suspend_all_other_threads)(void);
-static void (CDECL *mono_threads_set_shutting_down)(void);
void (CDECL *mono_trace_set_assembly)(MonoAssembly *assembly);
static BOOL find_mono_dll(LPCWSTR path, LPWSTR dll_path);
@@ -134,10 +129,6 @@ static void set_environment(LPCWSTR bin_path)
SetEnvironmentVariableW(pathW, path_env);
}
-static void CDECL do_nothing(void)
-{
-}
-
static MonoImage* CDECL image_open_module_handle_dummy(HMODULE module_handle,
char* fname, UINT has_entry_point, MonoImageOpenStatus* status)
{
@@ -218,7 +209,6 @@ static HRESULT load_mono(CLRRuntimeInfo *This)
LOAD_MONO_FUNCTION(mono_reflection_type_from_name);
LOAD_MONO_FUNCTION(mono_runtime_invoke);
LOAD_MONO_FUNCTION(mono_runtime_object_init);
- LOAD_MONO_FUNCTION(mono_runtime_quit);
LOAD_MONO_FUNCTION(mono_set_dirs);
LOAD_MONO_FUNCTION(mono_set_verbose_level);
LOAD_MONO_FUNCTION(mono_stringify_assembly_name);
@@ -237,10 +227,6 @@ static HRESULT load_mono(CLRRuntimeInfo *This)
} while (0);
LOAD_OPT_MONO_FUNCTION(mono_image_open_from_module_handle, image_open_module_handle_dummy);
- LOAD_OPT_MONO_FUNCTION(mono_runtime_set_shutting_down, do_nothing);
- LOAD_OPT_MONO_FUNCTION(mono_thread_pool_cleanup, do_nothing);
- LOAD_OPT_MONO_FUNCTION(mono_thread_suspend_all_other_threads, do_nothing);
- LOAD_OPT_MONO_FUNCTION(mono_threads_set_shutting_down, do_nothing);
#undef LOAD_OPT_MONO_FUNCTION
@@ -306,31 +292,6 @@ static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost *
return hr;
}
-void unload_all_runtimes(void)
-{
- int i;
- HMODULE handle;
-
- /* If the only references to mscoree are through dll's that were loaded by
- * Mono, shutting down the Mono runtime will free mscoree, so take a
- * reference to prevent that from happening. */
- GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (const WCHAR *)unload_all_runtimes, &handle);
-
- if (mono_handle && is_mono_started && !is_mono_shutdown)
- {
- /* Copied from Mono's ves_icall_System_Environment_Exit */
- mono_threads_set_shutting_down();
- mono_runtime_set_shutting_down();
- mono_thread_pool_cleanup();
- mono_thread_suspend_all_other_threads();
- mono_runtime_quit();
- }
-
- for (i=0; i<NUM_RUNTIMES; i++)
- if (runtimes[i].loaded_runtime)
- RuntimeHost_Destroy(runtimes[i].loaded_runtime);
-}
-
void expect_no_runtimes(void)
{
if (mono_handle && is_mono_started && !is_mono_shutdown)
@@ -1147,9 +1108,21 @@ static HRESULT WINAPI CLRMetaHost_QueryLegacyV2RuntimeBinding(ICLRMetaHost* ifac
return E_NOTIMPL;
}
-static HRESULT WINAPI CLRMetaHost_ExitProcess(ICLRMetaHost* iface, INT32 iExitCode)
+HRESULT WINAPI CLRMetaHost_ExitProcess(ICLRMetaHost* iface, INT32 iExitCode)
{
- FIXME("%i: stub\n", iExitCode);
+ TRACE("%i\n", iExitCode);
+
+ EnterCriticalSection(&runtime_list_cs);
+
+ if (is_mono_started && !is_mono_shutdown)
+ {
+ /* search for a runtime and call System.Environment.Exit() */
+ int i;
+
+ for (i=0; i<NUM_RUNTIMES; i++)
+ if (runtimes[i].loaded_runtime)
+ RuntimeHost_ExitProcess(runtimes[i].loaded_runtime, iExitCode);
+ }
ExitProcess(iExitCode);
}
diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c
index 2ca0ce7..7b655b9 100644
--- a/dlls/mscoree/mscoree_main.c
+++ b/dlls/mscoree/mscoree_main.c
@@ -249,8 +249,7 @@ __int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName,
void WINAPI CorExitProcess(int exitCode)
{
TRACE("(%x)\n", exitCode);
- unload_all_runtimes();
- ExitProcess(exitCode);
+ CLRMetaHost_ExitProcess(0, exitCode);
}
VOID WINAPI _CorImageUnloading(PVOID imageBase)
diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h
index 2a6d32e..820d081 100644
--- a/dlls/mscoree/mscoree_private.h
+++ b/dlls/mscoree/mscoree_private.h
@@ -162,12 +162,12 @@ extern void (CDECL *mono_thread_manage)(void);
extern void (CDECL *mono_trace_set_assembly)(MonoAssembly *assembly);
/* loaded runtime interfaces */
-extern void unload_all_runtimes(void) DECLSPEC_HIDDEN;
-
extern void expect_no_runtimes(void) DECLSPEC_HIDDEN;
extern HRESULT RuntimeHost_Construct(const CLRRuntimeInfo *runtime_version, RuntimeHost** result) DECLSPEC_HIDDEN;
+extern void RuntimeHost_ExitProcess(RuntimeHost *This, INT exitcode) DECLSPEC_HIDDEN;
+
extern HRESULT RuntimeHost_GetInterface(RuntimeHost *This, REFCLSID clsid, REFIID riid, void **ppv) DECLSPEC_HIDDEN;
extern HRESULT RuntimeHost_GetIUnknownForObject(RuntimeHost *This, MonoObject *obj, IUnknown **ppUnk) DECLSPEC_HIDDEN;
@@ -177,6 +177,8 @@ extern HRESULT RuntimeHost_CreateManagedInstance(RuntimeHost *This, LPCWSTR name
extern HRESULT RuntimeHost_Destroy(RuntimeHost *This) DECLSPEC_HIDDEN;
+HRESULT WINAPI CLRMetaHost_ExitProcess(ICLRMetaHost* iface, INT32 iExitCode) DECLSPEC_HIDDEN;
+
HRESULT WINAPI CLRMetaHost_GetRuntime(ICLRMetaHost* iface, LPCWSTR pwzVersion, REFIID iid, LPVOID *ppRuntime) DECLSPEC_HIDDEN;
extern HRESULT CorDebug_Create(ICLRRuntimeHost *runtimehost, IUnknown** ppUnk) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list