#include <mono/metadata/mono-debug-debugger.h>
#include "debug-mini.h"
-#ifdef HAVE_VALGRIND_H
-#include <valgrind/valgrind.h>
-#endif
+#include <mono/utils/valgrind.h>
#ifdef MONO_DEBUGGER_SUPPORTED
#include <libgc/include/libgc-mono-debugger.h>
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;
*/
MonoDebuggerExceptionState exception_state;
+ guint32 internal_flags;
+
MonoJitTlsData *jit_tls;
- MonoThread *thread;
+ MonoInternalThread *thread;
};
typedef struct {
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);
g_free (addresses);
g_free (lines);
+ mono_metadata_free_mh (header);
#endif /* VALGRIND_ADD_LINE_INFO */
}
}
method = cfg->method;
- header = mono_method_get_header (method);
+ header = cfg->header;
sig = mono_method_signature (method);
jit = info->jit;
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) ||
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) ||
prev_native_offset = native_offset;
}
+ mono_metadata_free_mh (header);
return 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;
{
#ifdef MONO_DEBUGGER_SUPPORTED
MonoDebuggerThreadInfo **ptr;
- MonoThread *thread = mono_thread_current ();
+ MonoInternalThread *thread = mono_thread_internal_current ();
if (!mono_debug_using_mono_debugger ())
return;
#if MONO_DEBUGGER_SUPPORTED
static MonoDebuggerThreadInfo *
-find_debugger_thread_info (MonoThread *thread)
+find_debugger_thread_info (MonoInternalThread *thread)
{
MonoDebuggerThreadInfo **ptr;
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;
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 ();
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;
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;
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")) {
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 ();
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