[MethodImplAttribute (MethodImplOptions.InternalCall)]
private static extern void mono_runtime_install_handlers ();
- static internal void InstallSignalHandlers ()
+#if MOBILE
+ public
+#else
+ internal
+#endif
+ static void InstallSignalHandlers ()
{
mono_runtime_install_handlers ();
}
+#if MOBILE
+ [MethodImplAttribute (MethodImplOptions.InternalCall)]
+ static extern void mono_runtime_cleanup_handlers ();
+
+ public static void RemoveSignalHandlers ()
+ {
+ mono_runtime_cleanup_handlers ();
+ }
+#endif
+
// Should not be removed intended for external use
// Safe to be called using reflection
// Format is undefined only for use as a string for reporting
static GHashTable *mono_saved_signal_handlers = NULL;
static struct sigaction *
-get_saved_signal_handler (int signo)
+get_saved_signal_handler (int signo, gboolean remove)
{
- if (mono_saved_signal_handlers)
+ if (mono_saved_signal_handlers) {
/* The hash is only modified during startup, so no need for locking */
- return (struct sigaction *)g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
+ struct sigaction *handler = g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
+ if (remove && handler)
+ g_hash_table_remove (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
+ return handler;
+ }
return NULL;
}
MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal)
{
int signal = MONO_SIG_HANDLER_GET_SIGNO ();
- struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal);
+ struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal, FALSE);
if (saved_handler && saved_handler->sa_handler) {
if (!(saved_handler->sa_flags & SA_SIGINFO)) {
remove_signal_handler (int signo)
{
struct sigaction sa;
- struct sigaction *saved_action = get_saved_signal_handler (signo);
+ struct sigaction *saved_action = get_saved_signal_handler (signo, TRUE);
if (!saved_action) {
sa.sa_handler = SIG_DFL;
ves_icall_get_trace);
mono_add_internal_call ("Mono.Runtime::mono_runtime_install_handlers",
mono_runtime_install_handlers);
+ mono_add_internal_call ("Mono.Runtime::mono_runtime_cleanup_handlers",
+ mono_runtime_cleanup_handlers);
#if defined(PLATFORM_ANDROID) || defined(TARGET_ANDROID)
mono_add_internal_call ("System.Diagnostics.Debugger::Mono_UnhandledException_internal",