/* FIXME fix cardtable WB to be out of line and check with the runtime if the target is not the WB trampoline. Another option is to encode wb ranges in MonoJitInfo, but that is somewhat hard. */ static gboolean is_thread_in_critical_region (MonoThreadInfo *info) { MonoMethod *method; MonoJitInfo *ji; gpointer stack_start; MonoThreadUnwindState *state; /* Are we inside a system critical region? */ if (info->inside_critical_region) return TRUE; if (threads_callbacks.mono_thread_in_critical_region && threads_callbacks.mono_thread_in_critical_region (info)) { return TRUE; } /* Are we inside a GC critical region? */ if (threads_callbacks.mono_thread_in_critical_region && threads_callbacks.mono_thread_in_critical_region (info)) { return TRUE; } /* The target thread might be shutting down and the domain might be null, which means no managed code left to run. */ state = mono_thread_info_get_suspend_state (info); if (!state->unwind_data [MONO_UNWIND_DATA_DOMAIN]) return FALSE; stack_start = MONO_CONTEXT_GET_SP (&state->ctx); /* altstack signal handler, sgen can't handle them, so we treat them as critical */ if (stack_start < info->stack_start_limit || stack_start >= info->stack_end) return TRUE; ji = mono_jit_info_table_find ( (MonoDomain *) state->unwind_data [MONO_UNWIND_DATA_DOMAIN], (char *) MONO_CONTEXT_GET_IP (&state->ctx)); if (!ji) return FALSE; method = mono_jit_info_get_method (ji); return threads_callbacks.mono_method_is_critical (method); }
/* FIXME fix cardtable WB to be out of line and check with the runtime if the target is not the WB trampoline. Another option is to encode wb ranges in MonoJitInfo, but that is somewhat hard. */ static gboolean is_thread_in_critical_region (MonoThreadInfo *info) { MonoMethod *method; MonoJitInfo *ji; if (info->inside_critical_region) return TRUE; ji = mono_jit_info_table_find ( info->suspend_state.unwind_data [MONO_UNWIND_DATA_DOMAIN], MONO_CONTEXT_GET_IP (&info->suspend_state.ctx)); if (!ji) return FALSE; method = mono_jit_info_get_method (ji); return threads_callbacks.mono_method_is_critical (method); }
char * mono_exception_get_native_backtrace (MonoException *exc) { #ifdef HAVE_BACKTRACE_SYMBOLS MonoDomain *domain; MonoArray *arr = exc->native_trace_ips; int i, len; GString *text; char **messages; if (!arr) return g_strdup (""); domain = mono_domain_get (); len = mono_array_length (arr); text = g_string_new_len (NULL, len * 20); uint32_t gchandle = mono_gchandle_new (&arr->obj, TRUE); /* pinned */ void* addr = mono_array_addr (arr, gpointer, 0); MONO_ENTER_GC_SAFE; messages = backtrace_symbols (addr, len); MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); for (i = 0; i < len; ++i) { gpointer ip = mono_array_get (arr, gpointer, i); MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), (char *)ip); if (ji) { char *msg = mono_debug_print_stack_frame (mono_jit_info_get_method (ji), (char*)ip - (char*)ji->code_start, domain); g_string_append_printf (text, "%s\n", msg); g_free (msg); } else { g_string_append_printf (text, "%s\n", messages [i]); } } g_free (messages); return g_string_free (text, FALSE); #else return g_strdup (""); #endif }
/* FIXME fix cardtable WB to be out of line and check with the runtime if the target is not the WB trampoline. Another option is to encode wb ranges in MonoJitInfo, but that is somewhat hard. */ static gboolean is_thread_in_critical_region (MonoThreadInfo *info) { MonoMethod *method; MonoJitInfo *ji; if (info->inside_critical_region) return TRUE; /* The target thread might be shutting down and the domain might be null, which means no managed code left to run. */ if (!info->suspend_state.unwind_data [MONO_UNWIND_DATA_DOMAIN]) return FALSE; ji = mono_jit_info_table_find ( info->suspend_state.unwind_data [MONO_UNWIND_DATA_DOMAIN], MONO_CONTEXT_GET_IP (&info->suspend_state.ctx)); if (!ji) return FALSE; method = mono_jit_info_get_method (ji); return threads_callbacks.mono_method_is_critical (method); }