diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 0da90830d448..37a1059764e6 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -5741,6 +5741,8 @@ ves_icall_Mono_Runtime_EnableMicrosoftTelemetry (char *appBundleID, char *appSig { #ifdef TARGET_OSX mono_merp_enable (appBundleID, appSignature, appVersion, merpGUIPath); + + mono_get_runtime_callbacks ()->runtime_telemetry_callback (); #else // Icall has platform check in managed too. g_assert_not_reached (); diff --git a/mono/metadata/object-internals.h b/mono/metadata/object-internals.h index aa2ef0c62039..d37102a7dda2 100644 --- a/mono/metadata/object-internals.h +++ b/mono/metadata/object-internals.h @@ -629,6 +629,7 @@ typedef struct { gpointer (*create_delegate_trampoline) (MonoDomain *domain, MonoClass *klass); gpointer (*interp_get_remoting_invoke) (gpointer imethod, MonoError *error); GHashTable *(*get_weak_field_indexes) (MonoImage *image); + void (*runtime_telemetry_callback) (void); } MonoRuntimeCallbacks; typedef gboolean (*MonoInternalStackWalk) (MonoStackFrameInfo *frame, MonoContext *ctx, gpointer data); diff --git a/mono/mini/mini-posix.c b/mono/mini/mini-posix.c index cfca6aeb4cd6..da8e9d82db23 100644 --- a/mono/mini/mini-posix.c +++ b/mono/mini/mini-posix.c @@ -73,6 +73,7 @@ #include #include #include +#include #endif #if defined(HOST_WATCHOS) @@ -210,6 +211,20 @@ MONO_SIG_HANDLER_FUNC (static, sigabrt_signal_handler) } } +#ifdef TARGET_OSX +MONO_SIG_HANDLER_FUNC (static, sigterm_signal_handler) +{ + MONO_SIG_HANDLER_INFO_TYPE *info = MONO_SIG_HANDLER_GET_INFO (); + MONO_SIG_HANDLER_GET_CONTEXT; + + if (mono_merp_enabled ()) + mono_handle_native_crash ("SIGTERM", ctx, info); + + mono_chain_signal (MONO_SIG_HANDLER_PARAMS); + exit (1); +} +#endif + #if (defined (USE_POSIX_BACKEND) && defined (SIGRTMIN)) || defined (SIGPROF) #define HAVE_PROFILER_SIGNAL #endif @@ -361,6 +376,15 @@ remove_signal_handler (int signo) } } +#ifdef TARGET_OSX +void +mini_register_sigterm_handler (void) +{ + /* always catch SIGTERM, conditionals inside of handler */ + add_signal_handler (SIGTERM, sigterm_signal_handler, 0); +} +#endif + void mono_runtime_posix_install_handlers (void) { diff --git a/mono/mini/mini-runtime.c b/mono/mini/mini-runtime.c index 3ea097265d41..8c15d8566103 100644 --- a/mono/mini/mini-runtime.c +++ b/mono/mini/mini-runtime.c @@ -4040,6 +4040,10 @@ mini_init (const char *filename, const char *runtime_version) #endif callbacks.get_weak_field_indexes = mono_aot_get_weak_field_indexes; +#ifdef TARGET_OSX + callbacks.runtime_telemetry_callback = mini_register_sigterm_handler; +#endif + mono_install_callbacks (&callbacks); memset (&ticallbacks, 0, sizeof (ticallbacks)); diff --git a/mono/mini/mini-runtime.h b/mono/mini/mini-runtime.h index 6c426af7f306..a288884240c2 100644 --- a/mono/mini/mini-runtime.h +++ b/mono/mini/mini-runtime.h @@ -528,5 +528,9 @@ gboolean MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal); #define DISABLE_SDB 1 #endif +#ifdef TARGET_OSX +void mini_register_sigterm_handler (void); +#endif + #endif /* __MONO_MINI_RUNTIME_H__ */