@@ -3243,37 +3243,44 @@ suspend_current (void)
3243
3243
tls = (DebuggerTlsData * )mono_native_tls_get_value (debugger_tls_id );
3244
3244
g_assert (tls );
3245
3245
3246
- mono_coop_mutex_lock (& suspend_mutex );
3246
+ gboolean do_resume = FALSE;
3247
+ while (!do_resume ) {
3248
+ mono_coop_mutex_lock (& suspend_mutex );
3247
3249
3248
- tls -> suspending = FALSE;
3249
- tls -> really_suspended = TRUE;
3250
+ tls -> suspending = FALSE;
3251
+ tls -> really_suspended = TRUE;
3250
3252
3251
- if (!tls -> suspended ) {
3252
- tls -> suspended = TRUE;
3253
- mono_coop_sem_post (& suspend_sem );
3254
- }
3253
+ if (!tls -> suspended ) {
3254
+ tls -> suspended = TRUE;
3255
+ mono_coop_sem_post (& suspend_sem );
3256
+ }
3255
3257
3256
- DEBUG_PRINTF (1 , "[%p] Suspended.\n" , (gpointer ) (gsize ) mono_native_thread_id_get ());
3258
+ DEBUG_PRINTF (1 , "[%p] Suspended.\n" , (gpointer ) (gsize ) mono_native_thread_id_get ());
3257
3259
3258
- while (suspend_count - tls -> resume_count > 0 ) {
3259
- mono_coop_cond_wait (& suspend_cond , & suspend_mutex );
3260
- }
3260
+ while (suspend_count - tls -> resume_count > 0 ) {
3261
+ mono_coop_cond_wait (& suspend_cond , & suspend_mutex );
3262
+ }
3261
3263
3262
- tls -> suspended = FALSE;
3263
- tls -> really_suspended = FALSE;
3264
+ tls -> suspended = FALSE;
3265
+ tls -> really_suspended = FALSE;
3264
3266
3265
- threads_suspend_count -- ;
3267
+ threads_suspend_count -- ;
3266
3268
3267
- mono_coop_mutex_unlock (& suspend_mutex );
3269
+ mono_coop_mutex_unlock (& suspend_mutex );
3268
3270
3269
- DEBUG_PRINTF (1 , "[%p] Resumed.\n" , (gpointer ) (gsize ) mono_native_thread_id_get ());
3271
+ DEBUG_PRINTF (1 , "[%p] Resumed.\n" , (gpointer ) (gsize ) mono_native_thread_id_get ());
3270
3272
3271
- if (tls -> pending_invoke ) {
3272
- /* Save the original context */
3273
- tls -> pending_invoke -> has_ctx = TRUE;
3274
- tls -> pending_invoke -> ctx = tls -> context .ctx ;
3273
+ if (tls -> pending_invoke ) {
3274
+ /* Save the original context */
3275
+ tls -> pending_invoke -> has_ctx = TRUE;
3276
+ tls -> pending_invoke -> ctx = tls -> context .ctx ;
3275
3277
3276
- invoke_method ();
3278
+ invoke_method ();
3279
+
3280
+ /* Have to suspend again */
3281
+ } else {
3282
+ do_resume = TRUE;
3283
+ }
3277
3284
}
3278
3285
3279
3286
/* The frame info becomes invalid after a resume */
@@ -8688,8 +8695,6 @@ invoke_method (void)
8688
8695
8689
8696
g_free (invoke -> p );
8690
8697
g_free (invoke );
8691
-
8692
- suspend_current ();
8693
8698
}
8694
8699
8695
8700
static gboolean
0 commit comments