[sgen] Refactor collection logging
[mono.git] / mono / metadata / sgen-os-mach.c
index 10ac567111ec81b022d058662e3dbde0ec612375..1f87eb137f329b42144817e3f483c7b3ab74df89 100644 (file)
 gboolean
 sgen_resume_thread (SgenThreadInfo *info)
 {
-       return thread_resume (info->client_info.info.native_handle) == KERN_SUCCESS;
+       kern_return_t ret;
+       do {
+               ret = thread_resume (info->client_info.info.native_handle);
+       } while (ret == KERN_ABORTED);
+       return ret == KERN_SUCCESS;
 }
 
 gboolean
@@ -51,11 +55,15 @@ sgen_suspend_thread (SgenThreadInfo *info)
        state = (thread_state_t) alloca (mono_mach_arch_get_thread_state_size ());
        mctx = (mcontext_t) alloca (mono_mach_arch_get_mcontext_size ());
 
-       ret = thread_suspend (info->client_info.info.native_handle);
+       do {
+               ret = thread_suspend (info->client_info.info.native_handle);
+       } while (ret == KERN_ABORTED);
        if (ret != KERN_SUCCESS)
                return FALSE;
 
-       ret = mono_mach_arch_get_thread_state (info->client_info.info.native_handle, state, &num_state);
+       do {
+               ret = mono_mach_arch_get_thread_state (info->client_info.info.native_handle, state, &num_state);
+       } while (ret == KERN_ABORTED);
        if (ret != KERN_SUCCESS)
                return FALSE;
 
@@ -70,11 +78,7 @@ sgen_suspend_thread (SgenThreadInfo *info)
        if (stack_start >= info->client_info.stack_start_limit && stack_start <= info->client_info.stack_end) {
                info->client_info.stack_start = stack_start;
 
-#ifdef USE_MONO_CTX
                mono_sigctx_to_monoctx (&ctx, &info->client_info.ctx);
-#else
-               ARCH_COPY_SIGCTX_REGS (&info->client_info.regs, &ctx);
-#endif
        } else {
                g_assert (!info->client_info.stack_start);
        }
@@ -117,7 +121,9 @@ sgen_thread_handshake (BOOL suspend)
                        if (!sgen_suspend_thread (info))
                                continue;
                } else {
-                       ret = thread_resume (info->client_info.info.native_handle);
+                       do {
+                               ret = thread_resume (info->client_info.info.native_handle);
+                       } while (ret == KERN_ABORTED);
                        if (ret != KERN_SUCCESS)
                                continue;
                }