summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/pty/pty.c2
-rw-r--r--test/test_pty.rb32
3 files changed, 38 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index a41fb0794a..2ddac9a469 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Oct 14 12:13:57 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/pty/pty.c (pty_check): should return nil until the child
+ terminates or stops. [ruby-dev:44600] [Bug #2642]
+
Fri Oct 14 11:19:37 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
* include/ruby/intern.h (rb_ary_reverse): export.
diff --git a/ext/pty/pty.c b/ext/pty/pty.c
index 3797972975..b18eb68f77 100644
--- a/ext/pty/pty.c
+++ b/ext/pty/pty.c
@@ -658,7 +658,7 @@ pty_check(int argc, VALUE *argv, VALUE self)
rb_scan_args(argc, argv, "11", &pid, &exc);
cpid = rb_waitpid(NUM2PIDT(pid), &status, WNOHANG|WUNTRACED);
- if (cpid == -1) return Qnil;
+ if (cpid == -1 || cpid == 0) return Qnil;
if (!RTEST(exc)) return rb_last_status_get();
raise_from_check(cpid, status);
diff --git a/test/test_pty.rb b/test/test_pty.rb
index fc8cd95c8b..025cafc8f8 100644
--- a/test/test_pty.rb
+++ b/test/test_pty.rb
@@ -163,5 +163,37 @@ class TestPTY < Test::Unit::TestCase
}
end
end
+
+ def test_pty_check_default
+ st1 = st2 = pid = nil
+ `echo` # preset $?
+ PTY.spawn("cat") do |r,w,id|
+ pid = id
+ st1 = PTY.check(pid)
+ w.close
+ r.close
+ sleep(0.1)
+ st2 = PTY.check(pid)
+ end
+ assert_equal(pid, st1.pid) if st1
+ assert_nil(st1)
+ assert_equal(pid, st2.pid)
+ end
+
+ def test_pty_check_raise
+ bug2642 = '[ruby-dev:44600]'
+ st1 = st2 = pid = nil
+ PTY.spawn("cat") do |r,w,id|
+ pid = id
+ assert_nothing_raised(PTY::ChildExited, bug2642) {st1 = PTY.check(pid, true)}
+ w.close
+ r.close
+ sleep(0.1)
+ st2 = assert_raise(PTY::ChildExited, bug2642) {PTY.check(pid, true)}.status
+ end
+ assert_equal(pid, st1.pid) if st1
+ assert_nil(st1)
+ assert_equal(pid, st2.pid)
+ end
end if defined? PTY