From 2a87a0fc732b7a6168cbf004bdfd6aba74e17586 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 8 Sep 2015 07:00:13 +0000 Subject: process.c: retry loop * process.c (rb_waitpid): refactor retry loop by interrupt. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51792 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- process.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'process.c') diff --git a/process.c b/process.c index 8081ce86f1..d3a1596d14 100644 --- a/process.c +++ b/process.c @@ -863,25 +863,28 @@ rb_waitpid_blocking(void *data) return (void *)(VALUE)result; } -rb_pid_t -rb_waitpid(rb_pid_t pid, int *st, int flags) +static rb_pid_t +do_waitpid_nonblocking(rb_pid_t pid, int *st, int flags) { - rb_pid_t result; + void *result; struct waitpid_arg arg; - - retry: arg.pid = pid; arg.st = st; arg.flags = flags; - result = (rb_pid_t)(VALUE)rb_thread_call_without_gvl(rb_waitpid_blocking, &arg, - RUBY_UBF_PROCESS, 0); - if (result < 0) { - if (errno == EINTR) { - rb_thread_t *th = GET_THREAD(); - RUBY_VM_CHECK_INTS(th); - goto retry; - } - return (rb_pid_t)-1; + result = rb_thread_call_without_gvl(rb_waitpid_blocking, &arg, + RUBY_UBF_PROCESS, 0); + return (rb_pid_t)(VALUE)result; +} + +rb_pid_t +rb_waitpid(rb_pid_t pid, int *st, int flags) +{ + rb_pid_t result; + + while ((result = do_waitpid_nonblocking(pid, st, flags)) < 0 && + (errno == EINTR)) { + rb_thread_t *th = GET_THREAD(); + RUBY_VM_CHECK_INTS(th); } if (result > 0) { rb_last_status_set(*st, result); -- cgit v1.2.3