#include <ctype.h>
#include "trace.h"
#include "version.h"
+#include "debugger-agent.h"
#include "jit-icalls.h"
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;
*/
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)
* 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);
return (pid_t) syscall (SYS_fork);
#else
g_assert_not_reached ();
+ return;
#endif
}