void mono_threads_core_clear_interruption (void) { wapi_clear_interruption (); }
static void SIG_HANDLER_SIGNATURE (sigusr1_signal_handler) { gboolean running_managed; MonoException *exc; MonoInternalThread *thread = mono_thread_internal_current (); MonoDomain *domain = mono_domain_get (); void *ji; GET_CONTEXT; if (!thread || !domain) /* The thread might not have started up yet */ /* FIXME: Specify the synchronization with start_wrapper () in threads.c */ return; if (thread->thread_dump_requested) { thread->thread_dump_requested = FALSE; mono_print_thread_dump (ctx); } /* * This is an async signal, so the code below must not call anything which * is not async safe. That includes the pthread locking functions. If we * know that we interrupted managed code, then locking is safe. */ /* * On OpenBSD, ctx can be NULL if we are interrupting poll (). */ if (ctx) { 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; } else { running_managed = FALSE; } /* We can't do handler block checking from metadata since it requires doing * a stack walk with context. * * FIXME add full-aot support. */ #ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX if (!mono_aot_only && ctx) { MonoThreadUnwindState unwind_state; if (mono_thread_state_init_from_sigctx (&unwind_state, ctx)) { if (mono_install_handler_block_guard (&unwind_state)) { #ifndef HOST_WIN32 /*Clear current thread from been wapi interrupted otherwise things can go south*/ wapi_clear_interruption (); #endif return; } } } #endif exc = mono_thread_request_interruption (running_managed); if (!exc) return; mono_arch_handle_exception (ctx, exc, FALSE); }