diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 685a06c906f93..189b968516329 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -2950,39 +2950,46 @@ suspend_current (void) tls = (DebuggerTlsData *)mono_native_tls_get_value (debugger_tls_id); g_assert (tls); - mono_coop_mutex_lock (&suspend_mutex); + gboolean do_resume = FALSE; + while (!do_resume) { + mono_coop_mutex_lock (&suspend_mutex); - tls->suspending = FALSE; - tls->really_suspended = TRUE; + tls->suspending = FALSE; + tls->really_suspended = TRUE; - if (!tls->suspended) { - tls->suspended = TRUE; - mono_coop_sem_post (&suspend_sem); - } + if (!tls->suspended) { + tls->suspended = TRUE; + mono_coop_sem_post (&suspend_sem); + } - mono_debugger_log_suspend (tls); - DEBUG_PRINTF (1, "[%p] Suspended.\n", (gpointer) (gsize) mono_native_thread_id_get ()); + mono_debugger_log_suspend (tls); + DEBUG_PRINTF (1, "[%p] Suspended.\n", (gpointer) (gsize) mono_native_thread_id_get ()); - while (suspend_count - tls->resume_count > 0) { - mono_coop_cond_wait (&suspend_cond, &suspend_mutex); - } + while (suspend_count - tls->resume_count > 0) { + mono_coop_cond_wait (&suspend_cond, &suspend_mutex); + } - tls->suspended = FALSE; - tls->really_suspended = FALSE; + tls->suspended = FALSE; + tls->really_suspended = FALSE; - threads_suspend_count --; + threads_suspend_count --; - mono_coop_mutex_unlock (&suspend_mutex); + mono_coop_mutex_unlock (&suspend_mutex); - mono_debugger_log_resume (tls); - DEBUG_PRINTF (1, "[%p] Resumed.\n", (gpointer) (gsize) mono_native_thread_id_get ()); + mono_debugger_log_resume (tls); + DEBUG_PRINTF (1, "[%p] Resumed.\n", (gpointer) (gsize) mono_native_thread_id_get ()); - if (tls->pending_invoke) { - /* Save the original context */ - tls->pending_invoke->has_ctx = TRUE; - tls->pending_invoke->ctx = tls->context.ctx; + if (tls->pending_invoke) { + /* Save the original context */ + tls->pending_invoke->has_ctx = TRUE; + tls->pending_invoke->ctx = tls->context.ctx; - invoke_method (); + invoke_method (); + + /* Have to suspend again */ + } else { + do_resume = TRUE; + } } /* The frame info becomes invalid after a resume */ @@ -6364,8 +6371,6 @@ invoke_method (void) g_free (invoke->p); g_free (invoke); - - suspend_current (); } static gboolean