From d3022c424cffc1e92b751e72fb450408e853e388 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 8 Sep 2015 07:15:09 +0000 Subject: [PATCH] process.c: keep GVL if WNOHANG * process.c (rb_waitpid): do not release GVL when WNOHANG is set, it should return immediately without blocking. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51793 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- process.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/process.c b/process.c index d3a1596d14..f915ff6193 100644 --- a/process.c +++ b/process.c @@ -846,20 +846,23 @@ struct waitpid_arg { int *st; }; -static void * -rb_waitpid_blocking(void *data) +static rb_pid_t +do_waitpid(rb_pid_t pid, int *st, int flags) { - rb_pid_t result; - struct waitpid_arg *arg = data; - #if defined HAVE_WAITPID - result = waitpid(arg->pid, arg->st, arg->flags); + return waitpid(pid, st, flags); #elif defined HAVE_WAIT4 - result = wait4(arg->pid, arg->st, arg->flags, NULL); + return wait4(pid, st, flags, NULL); #else # error waitpid or wait4 is required. #endif +} +static void * +rb_waitpid_blocking(void *data) +{ + struct waitpid_arg *arg = data; + rb_pid_t result = do_waitpid(arg->pid, arg->st, arg->flags); return (void *)(VALUE)result; } @@ -881,10 +884,15 @@ 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 (flags & WNOHANG) { + result = do_waitpid(pid, st, flags); + } + else { + 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);