[前][次][番号順一覧][スレッド一覧]

ruby-changes:64100

From: Nobuyoshi <ko1@a...>
Date: Fri, 11 Dec 2020 20:26:57 +0900 (JST)
Subject: [ruby-changes:64100] ed343c76fb (master): RDoc states that Process::Status.wait returns nil if cannot wait

https://git.ruby-lang.org/ruby.git/commit/?id=ed343c76fb

From ed343c76fbd94dfcd429668b72844e0db87a0b46 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Fri, 11 Dec 2020 19:54:14 +0900
Subject: RDoc states that Process::Status.wait returns nil if cannot wait


diff --git a/process.c b/process.c
index d880ca5..0e3baec 100644
--- a/process.c
+++ b/process.c
@@ -572,7 +572,6 @@ static VALUE rb_cProcessStatus; https://github.com/ruby/ruby/blob/trunk/process.c#L572
 struct rb_process_status {
     rb_pid_t pid;
     int status;
-    int error;
 };
 
 static const rb_data_type_t rb_process_status_type = {
@@ -620,29 +619,22 @@ proc_s_last_status(VALUE mod) https://github.com/ruby/ruby/blob/trunk/process.c#L619
 }
 
 VALUE
-rb_process_status_new(rb_pid_t pid, int status, int error)
+rb_process_status_new(rb_pid_t pid, int status)
 {
     VALUE last_status = rb_process_status_allocate(rb_cProcessStatus);
 
     struct rb_process_status *data = RTYPEDDATA_DATA(last_status);
     data->pid = pid;
     data->status = status;
-    data->error = error;
 
     rb_obj_freeze(last_status);
     return last_status;
 }
 
-static void
-process_status_set(rb_pid_t pid, int status, int error)
-{
-    GET_THREAD()->last_status = rb_process_status_new(pid, status, error);
-}
-
 void
 rb_last_status_set(int status, rb_pid_t pid)
 {
-    process_status_set(pid, status, 0);
+    GET_THREAD()->last_status = rb_process_status_new(pid, status);
 }
 
 void
@@ -1334,14 +1326,16 @@ rb_process_status_wait(rb_pid_t pid, int flags) https://github.com/ruby/ruby/blob/trunk/process.c#L1326
         waitpid_no_SIGCHLD(w);
     }
 
-    if (w->ret > 0) {
-        if (ruby_nocldwait) {
-            w->ret = -1;
-            w->errnum = ECHILD;
-        }
+    VALUE status = Qnil;
+    if (w->ret == -1) {
+        errno = w->errnum;
+    }
+    else if (w->ret > 0 && ruby_nocldwait) {
+        errno = ECHILD;
+    }
+    else {
+        status = rb_process_status_new(w->ret, w->status);
     }
-
-    VALUE status = rb_process_status_new(w->ret, w->status, w->errnum);
 
     COROUTINE_STACK_FREE(w);
 
@@ -1415,19 +1409,16 @@ rb_pid_t https://github.com/ruby/ruby/blob/trunk/process.c#L1409
 rb_waitpid(rb_pid_t pid, int *st, int flags)
 {
     VALUE status = rb_process_status_wait(pid, flags);
+    if (NIL_P(status)) return -1;
+
     struct rb_process_status *data = RTYPEDDATA_DATA(status);
+    pid = data->pid;
 
     if (st) *st = data->status;
 
-    if (data->pid == -1) {
-        errno = data->error;
-    }
-    else {
-        GET_THREAD()->last_status = status;
-    }
+    GET_THREAD()->last_status = status;
 
-    RB_GC_GUARD(status);
-    return data->pid;
+    return pid;
 }
 
 static VALUE
diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb
index 4f96a62..53d0cd0 100644
--- a/test/ruby/test_process.rb
+++ b/test/ruby/test_process.rb
@@ -1459,6 +1459,10 @@ class TestProcess < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_process.rb#L1459
     end
   end
 
+  def test_status_fail
+    assert_nil(Process::Status.wait($$))
+  end
+
   def test_wait_without_arg
     with_tmpchdir do
       write_file("foo", "sleep 0.1")
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]