fix compiling xdebug with DISABLE_AOT || DISABLE_JIT
[mono.git] / mono / mini / mini-posix.c
index f811a2bfe55a2f81c3faeee4fa780f88bcfa384b..9a2317b8ec79c788c650bf0ed54be997ddd13cf0 100644 (file)
@@ -59,6 +59,7 @@
 #include <ctype.h>
 #include "trace.h"
 #include "version.h"
+#include "debugger-agent.h"
 
 #include "jit-icalls.h"
 
@@ -143,10 +144,11 @@ SIG_HANDLER_SIGNATURE (mono_chain_signal)
 static void
 SIG_HANDLER_SIGNATURE (sigabrt_signal_handler)
 {
-       MonoJitInfo *ji;
+       MonoJitInfo *ji = NULL;
        GET_CONTEXT;
 
-       ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context(ctx));
+       if (mono_thread_internal_current ())
+               ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context(ctx));
        if (!ji) {
         if (mono_chain_signal (SIG_HANDLER_PARAMS))
                        return;
@@ -184,6 +186,9 @@ SIG_HANDLER_SIGNATURE (sigusr1_signal_handler)
         */
        ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context(ctx));
        running_managed = ji != NULL;
+
+       if (mono_debugger_agent_thread_interrupt (ctx, ji))
+               return;
        
        exc = mono_thread_request_interruption (running_managed); 
        if (!exc)
@@ -355,10 +360,19 @@ add_signal_handler (int signo, gpointer handler)
                 * an altstack, so delay the suspend signal after the signal handler has
                 * executed.
                 */
-               if (GC_get_suspend_signal () != -1)
-                       sigaddset (&sa.sa_mask, GC_get_suspend_signal ());
+               if (mono_gc_get_suspend_signal () != -1)
+                       sigaddset (&sa.sa_mask, mono_gc_get_suspend_signal ());
        }
 #endif
+       if (signo == SIGSEGV) {
+               /* 
+                * Delay abort signals while handling SIGSEGVs since they could go unnoticed.
+                */
+               sigset_t block_mask;
+     
+               sigemptyset (&block_mask);
+               sigaddset (&sa.sa_mask, mono_thread_get_abort_signal ());
+       }
 #else
        sa.sa_handler = handler;
        sigemptyset (&sa.sa_mask);
@@ -555,6 +569,7 @@ mono_runtime_syscall_fork ()
        return (pid_t) syscall (SYS_fork);
 #else
        g_assert_not_reached ();
+       return;
 #endif
 }