aboutsummaryrefslogtreecommitdiffstats
path: root/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'process.c')
-rw-r--r--process.c30
1 files 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);