This makes Wine output Mono logging messages like `MONO_GC_DEBUG=log-finalizers` etc.
-- v5: mscoree: Register mono log handler callback.
From: Bernhard Kölbl bkoelbl@codeweavers.com
Signed-off-by: Bernhard Kölbl bkoelbl@codeweavers.com --- dlls/mscoree/metahost.c | 7 +++++++ dlls/mscoree/mscoree_main.c | 14 ++++++++++++++ dlls/mscoree/mscoree_private.h | 2 ++ 3 files changed, 23 insertions(+)
diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c index f57fa065e08..e1dd00656e9 100644 --- a/dlls/mscoree/metahost.c +++ b/dlls/mscoree/metahost.c @@ -129,6 +129,7 @@ MonoThread* (CDECL *mono_thread_attach)(MonoDomain *domain); void (CDECL *mono_thread_manage)(void); void (CDECL *mono_trace_set_print_handler)(MonoPrintCallback callback); void (CDECL *mono_trace_set_printerr_handler)(MonoPrintCallback callback); +void (CDECL *mono_trace_set_log_handler)(MonoLogCallback callback, void *user_data); static MonoAssembly* (CDECL *wine_mono_assembly_load_from_gac)(MonoAssemblyName *aname, MonoImageOpenStatus *status, int refonly); static void (CDECL *wine_mono_install_assembly_preload_hook)(WineMonoAssemblyPreLoadFunc func, void *user_data); static void (CDECL *wine_mono_install_assembly_preload_hook_v2)(WineMonoAssemblyPreLoadFunc func, void *user_data); @@ -155,6 +156,10 @@ static void CDECL set_print_handler_dummy(MonoPrintCallback callback) { }
+static void CDECL set_log_handler_dummy (MonoLogCallback callback, void *user_data) +{ +} + static HRESULT load_mono(LPCWSTR mono_path) { static const WCHAR lib[] = {'\','l','i','b',0}; @@ -253,6 +258,7 @@ static HRESULT load_mono(LPCWSTR mono_path) LOAD_OPT_MONO_FUNCTION(mono_set_crash_chaining, set_crash_chaining_dummy); LOAD_OPT_MONO_FUNCTION(mono_trace_set_print_handler, set_print_handler_dummy); LOAD_OPT_MONO_FUNCTION(mono_trace_set_printerr_handler, set_print_handler_dummy); + LOAD_OPT_MONO_FUNCTION(mono_trace_set_log_handler, set_log_handler_dummy); LOAD_OPT_MONO_FUNCTION(wine_mono_assembly_load_from_gac, NULL); LOAD_OPT_MONO_FUNCTION(wine_mono_install_assembly_preload_hook, NULL); LOAD_OPT_MONO_FUNCTION(wine_mono_install_assembly_preload_hook_v2, NULL); @@ -281,6 +287,7 @@ static HRESULT load_mono(LPCWSTR mono_path)
mono_trace_set_print_handler(mono_print_handler_fn); mono_trace_set_printerr_handler(mono_print_handler_fn); + mono_trace_set_log_handler(mono_log_handler_fn, NULL);
mono_set_dirs(mono_lib_path_a, mono_etc_path_a);
diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c index a1bc8883787..2b9f78a3955 100644 --- a/dlls/mscoree/mscoree_main.c +++ b/dlls/mscoree/mscoree_main.c @@ -262,6 +262,20 @@ void CDECL mono_print_handler_fn(const char *string, INT is_stdout) } }
+void CDECL mono_log_handler_fn(const char *log_domain, const char *log_level, const char *message, INT fatal, void *user_data) +{ + SIZE_T len = (log_domain ? strlen(log_domain) + 2 : 0) + strlen(message) + strlen("\n") + 1; + char *msg = calloc(len, sizeof(char)); + + if (msg) + { + sprintf(msg, "%s%s%s\n", log_domain ? log_domain : "", log_domain ? ": " : "", message); + mono_print_handler_fn(msg, 0); + } + + free(msg); +} + BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(%p, %ld, %p)\n", hinstDLL, fdwReason, lpvReserved); diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h index cec63d7bac7..6dff5f61bbb 100644 --- a/dlls/mscoree/mscoree_private.h +++ b/dlls/mscoree/mscoree_private.h @@ -153,6 +153,7 @@ typedef MonoAssembly* (CDECL *WineMonoAssemblyPreLoadFunc)(MonoAssemblyName *ana typedef void (CDECL *MonoProfileFunc)(MonoProfiler *prof);
typedef void (CDECL *MonoPrintCallback) (const char *string, INT is_stdout); +typedef void (*MonoLogCallback) (const char *log_domain, const char *log_level, const char *message, INT fatal, void *user_data);
typedef enum { MONO_AOT_MODE_NONE, @@ -227,5 +228,6 @@ extern void runtimehost_init(void); extern void runtimehost_uninit(void);
extern void CDECL mono_print_handler_fn(const char *string, INT is_stdout); +extern void CDECL mono_log_handler_fn(const char *log_domain, const char *log_level, const char *message, INT fatal, void *user_data);
#endif /* __MSCOREE_PRIVATE__ */
On Sat Sep 28 17:56:22 2024 +0000, Esme Povirk wrote:
If message can be NULL as the `len` calculation implies, then we need to handle it here too. But I'd expect that it can't be NULL and calling strlen(message) is fine.
should be good now?
This merge request was approved by Esme Povirk.