/* The exception port */
static mach_port_t mach_exception_port = VM_MAP_NULL;
+kern_return_t
+catch_exception_raise (
+ mach_port_t exception_port,
+ mach_port_t thread,
+ mach_port_t task,
+ exception_type_t exception,
+ exception_data_t code,
+ mach_msg_type_number_t code_count);
+
/*
* Implicitly called by exc_server. Must be public.
*
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
- g_assert (result == MACH_MSG_SUCCESS);
+ /*
+ If we try to abort the thread while delivering an exception. The port will be gone since the kernel
+ setup a send once port to deliver the resume message and thread_abort will consume it.
+ */
+ g_assert (result == MACH_MSG_SUCCESS || result == MACH_SEND_INVALID_DEST);
}
return NULL;
}
static void
-macosx_register_exception_handler ()
+macosx_register_exception_handler (void)
{
mach_port_t task;
pthread_attr_t attr;
/* This is #define'd by Boehm GC to _GC_dlopen. */
#undef dlopen
+void* dlopen(const char* path, int mode);
+
void
mono_runtime_install_handlers (void)
{
domain = mono_mach_arch_get_tls_value_from_thread (thread_id, domain_key);
/*Thread already started to cleanup, can no longer capture unwind state*/
- if (!jit_tls)
+ if (!jit_tls || !domain)
return FALSE;
- g_assert (domain);
#if defined (MONO_ARCH_ENABLE_MONO_LMF_VAR)
lmf_key = mono_get_lmf_tls_offset ();