static void update_current_thread_stack (void *start) { int stack_guard = 0; SgenThreadInfo *info = mono_thread_info_current (); info->client_info.stack_start = align_pointer (&stack_guard); g_assert (info->client_info.stack_start); g_assert (info->client_info.stack_start >= info->client_info.stack_start_limit && info->client_info.stack_start < info->client_info.stack_end); #if !defined(MONO_CROSS_COMPILE) && MONO_ARCH_HAS_MONO_CONTEXT MONO_CONTEXT_GET_CURRENT (info->client_info.ctx); #else g_error ("Sgen STW requires a working mono-context"); #endif if (mono_gc_get_gc_callbacks ()->thread_suspend_func) mono_gc_get_gc_callbacks ()->thread_suspend_func (info->client_info.runtime_data, NULL, &info->client_info.ctx); }
static void update_current_thread_stack (void *start) { int stack_guard = 0; #if !defined(USE_MONO_CTX) void *reg_ptr = cur_thread_regs; #endif SgenThreadInfo *info = mono_thread_info_current (); info->stack_start = align_pointer (&stack_guard); g_assert (info->stack_start >= info->stack_start_limit && info->stack_start < info->stack_end); #ifdef USE_MONO_CTX MONO_CONTEXT_GET_CURRENT (cur_thread_ctx); memcpy (&info->ctx, &cur_thread_ctx, sizeof (MonoContext)); if (mono_gc_get_gc_callbacks ()->thread_suspend_func) mono_gc_get_gc_callbacks ()->thread_suspend_func (info->runtime_data, NULL, &info->ctx); #else ARCH_STORE_REGS (reg_ptr); memcpy (&info->regs, reg_ptr, sizeof (info->regs)); if (mono_gc_get_gc_callbacks ()->thread_suspend_func) mono_gc_get_gc_callbacks ()->thread_suspend_func (info->runtime_data, NULL, NULL); #endif }