X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsgen-os-mach.c;h=1f87eb137f329b42144817e3f483c7b3ab74df89;hb=52d58c1c5d1770f2c45cbe22b6f2a80b1f886dcc;hp=10ac567111ec81b022d058662e3dbde0ec612375;hpb=3e81958f1dd4cecb97167c5b3cb5541bda31c444;p=mono.git diff --git a/mono/metadata/sgen-os-mach.c b/mono/metadata/sgen-os-mach.c index 10ac567111e..1f87eb137f3 100644 --- a/mono/metadata/sgen-os-mach.c +++ b/mono/metadata/sgen-os-mach.c @@ -34,7 +34,11 @@ 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; }