diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-08 07:00:13 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-09-08 07:00:13 +0000 |
commit | 2a87a0fc732b7a6168cbf004bdfd6aba74e17586 (patch) | |
tree | 6fd1e0e9fb8eedfa8087c1634f76b1e9312cb258 /process.c | |
parent | d5d6b149df3d2d565859599334327e378e5b2a84 (diff) | |
download | ruby-2a87a0fc732b7a6168cbf004bdfd6aba74e17586.tar.gz |
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
Diffstat (limited to 'process.c')
-rw-r--r-- | process.c | 31 |
1 files changed, 17 insertions, 14 deletions
@@ -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); |