X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fdebug-mini.c;h=29131f9c3c6f8741a0a31ba2ce37bcf32921864e;hb=fcc75485b66e9f51706077ec8abfc17e7e793d55;hp=f89e0a263993c8b79286e0a6a50472ccefde1bc6;hpb=ea8a36774a9b2baadcb1c80d29769c56a8ed5c1e;p=mono.git diff --git a/mono/mini/debug-mini.c b/mono/mini/debug-mini.c index f89e0a26399..29131f9c3c6 100644 --- a/mono/mini/debug-mini.c +++ b/mono/mini/debug-mini.c @@ -51,6 +51,12 @@ typedef enum { MONO_DEBUGGER_THREAD_FLAGS_THREADPOOL = 2 } MonoDebuggerThreadFlags; +typedef enum { + MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_NONE = 0, + MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE = 1, + MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED = 2 +} MonoDebuggerInternalThreadFlags; + struct _MonoDebuggerThreadInfo { guint64 tid; guint64 lmf_addr; @@ -76,8 +82,10 @@ struct _MonoDebuggerThreadInfo { */ MonoDebuggerExceptionState exception_state; + guint32 internal_flags; + MonoJitTlsData *jit_tls; - MonoThread *thread; + MonoInternalThread *thread; }; typedef struct { @@ -128,7 +136,7 @@ mono_debug_open_method (MonoCompile *cfg) mono_class_init (cfg->method->klass); - header = mono_method_get_header (cfg->method); + header = cfg->header; g_assert (header); info->jit = jit = g_new0 (MonoDebugMethodJitInfo, 1); @@ -251,6 +259,7 @@ mono_debug_add_vg_method (MonoMethod *method, MonoDebugMethodJitInfo *jit) g_free (addresses); g_free (lines); + mono_metadata_free_mh (header); #endif /* VALGRIND_ADD_LINE_INFO */ } @@ -273,7 +282,7 @@ mono_debug_close_method (MonoCompile *cfg) } method = cfg->method; - header = mono_method_get_header (method); + header = cfg->header; sig = mono_method_signature (method); jit = info->jit; @@ -326,7 +335,7 @@ mono_debug_record_line_number (MonoCompile *cfg, MonoInst *ins, guint32 address) if (!info || !info->jit || !ins->cil_code) return; - header = mono_method_get_header (cfg->method); + header = cfg->header; g_assert (header); if ((ins->cil_code < header->code) || @@ -353,7 +362,7 @@ mono_debug_open_block (MonoCompile *cfg, MonoBasicBlock *bb, guint32 address) if (!info || !info->jit || !bb->cil_code) return; - header = mono_method_get_header (cfg->method); + header = cfg->header; g_assert (header); if ((bb->cil_code < header->code) || @@ -581,6 +590,7 @@ deserialize_debug_info (MonoMethod *method, guint8 *code_start, guint8 *buf, gui prev_native_offset = native_offset; } + mono_metadata_free_mh (header); return jit; } @@ -788,7 +798,7 @@ mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit info = g_new0 (MonoDebuggerThreadInfo, 1); info->tid = tid; - info->thread = thread; + info->thread = thread->internal_thread; info->stack_start = (guint64) (gsize) staddr; info->signal_stack_start = (guint64) (gsize) jit_tls->signal_stack; info->stack_size = stsize; @@ -846,7 +856,7 @@ mono_debugger_extended_notification (MonoDebuggerEvent event, guint64 data, guin { #ifdef MONO_DEBUGGER_SUPPORTED MonoDebuggerThreadInfo **ptr; - MonoThread *thread = mono_thread_current (); + MonoInternalThread *thread = mono_thread_internal_current (); if (!mono_debug_using_mono_debugger ()) return; @@ -888,7 +898,7 @@ mono_debugger_trampoline_compiled (const guint8 *trampoline, MonoMethod *method, #if MONO_DEBUGGER_SUPPORTED static MonoDebuggerThreadInfo * -find_debugger_thread_info (MonoThread *thread) +find_debugger_thread_info (MonoInternalThread *thread) { MonoDebuggerThreadInfo **ptr; @@ -915,12 +925,17 @@ _mono_debugger_throw_exception (gpointer addr, gpointer stack, MonoObject *exc) mono_debugger_lock (); - thread_info = find_debugger_thread_info (mono_thread_current ()); + thread_info = find_debugger_thread_info (mono_thread_internal_current ()); if (!thread_info) { mono_debugger_unlock (); return MONO_DEBUGGER_EXCEPTION_ACTION_NONE; } + if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) { + mono_debugger_unlock (); + return MONO_DEBUGGER_EXCEPTION_ACTION_NONE; + } + if (thread_info->exception_state.stopped_on_exception || thread_info->exception_state.stopped_on_unhandled) { thread_info->exception_state.stopped_on_exception = 0; @@ -985,12 +1000,17 @@ _mono_debugger_unhandled_exception (gpointer addr, gpointer stack, MonoObject *e mono_debugger_lock (); - thread_info = find_debugger_thread_info (mono_thread_current ()); + thread_info = find_debugger_thread_info (mono_thread_internal_current ()); if (!thread_info) { mono_debugger_unlock (); return FALSE; } + if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) { + mono_debugger_unlock (); + return FALSE; + } + if (thread_info->exception_state.stopped_on_unhandled) { thread_info->exception_state.stopped_on_unhandled = 0; mono_debugger_unlock (); @@ -1031,12 +1051,17 @@ mono_debugger_call_exception_handler (gpointer addr, gpointer stack, MonoObject mono_debugger_lock (); - thread_info = find_debugger_thread_info (mono_thread_current ()); + thread_info = find_debugger_thread_info (mono_thread_internal_current ()); if (!thread_info) { mono_debugger_unlock (); return; } + if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) { + mono_debugger_unlock (); + return; + } + // Prevent the object from being finalized. thread_info->exception_state.last_exception = exc; @@ -1102,7 +1127,7 @@ mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, Mono mono_debugger_lock (); - thread_info = find_debugger_thread_info (mono_thread_current ()); + thread_info = find_debugger_thread_info (mono_thread_internal_current ()); if (!thread_info) { mono_debugger_unlock (); return NULL; @@ -1114,6 +1139,8 @@ mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, Mono thread_info->exception_state.stopped_on_unhandled = 0; thread_info->exception_state.stopped_on_exception = 0; + thread_info->internal_flags |= MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE; + mono_debugger_unlock (); if (!strcmp (method->name, ".ctor")) { @@ -1125,9 +1152,18 @@ mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, Mono mono_debugger_lock (); - thread_info = find_debugger_thread_info (mono_thread_current ()); - if (thread_info) - thread_info->exception_state = saved_exception_state; + thread_info->exception_state = saved_exception_state; + thread_info->internal_flags &= ~MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE; + + if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) { + thread_info->internal_flags &= ~MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED; + mono_thread_internal_reset_abort (thread_info->thread); + + mono_debugger_unlock (); + + *exc = NULL; + return NULL; + } mono_debugger_unlock (); @@ -1144,4 +1180,35 @@ mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, Mono return retval; } +gboolean +mono_debugger_abort_runtime_invoke () +{ + MonoInternalThread *thread = mono_thread_internal_current (); + MonoDebuggerThreadInfo *thread_info; + + mono_debugger_lock (); + + thread_info = find_debugger_thread_info (thread); + if (!thread_info) { + mono_debugger_unlock (); + return FALSE; + } + + if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE) == 0) { + mono_debugger_unlock (); + return FALSE; + } + + if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) { + mono_debugger_unlock (); + return TRUE; + } + + thread_info->internal_flags |= MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED; + ves_icall_System_Threading_Thread_Abort (thread_info->thread, NULL); + + mono_debugger_unlock (); + return TRUE; +} + #endif