summaryrefslogtreecommitdiff
path: root/test/ruby/test_process.rb
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-11-30 08:11:36 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-11-30 08:11:36 +0000
commitea44d4d9d5ddb4102818c858cea91977469a3dc9 (patch)
tree814eb25bf0aaa4f8ad5a1ff9e5afa482339d474d /test/ruby/test_process.rb
parent1ce81d6f8b00186dcae04005f502248f986fbe75 (diff)
* test/ruby/test_process.rb (test_deadlock_by_signal_at_forking): Use
assert_separately. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48653 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/ruby/test_process.rb')
-rw-r--r--test/ruby/test_process.rb101
1 files changed, 53 insertions, 48 deletions
diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb
index 15a83a33ba..4f67cf36fd 100644
--- a/test/ruby/test_process.rb
+++ b/test/ruby/test_process.rb
@@ -1918,59 +1918,64 @@ EOS
end
def test_deadlock_by_signal_at_forking
- GC.start # reduce garbage
- buf = ''
- ruby = EnvUtil.rubybin
- er, ew = IO.pipe
- unless runner = IO.popen("-".freeze)
- er.close
- status = true
- GC.disable # avoid triggering CoW after forks
+ assert_separately([], <<-INPUT)
+ require 'io/wait'
begin
- $stderr.reopen($stdout)
- trap(:QUIT) {}
- parent = $$
- 100.times do |i|
- pid = fork {Process.kill(:QUIT, parent)}
- IO.popen(ruby, 'r+'.freeze){}
- Process.wait(pid)
- $stdout.puts
- $stdout.flush
+ GC.start # reduce garbage
+ buf = ''
+ ruby = EnvUtil.rubybin
+ er, ew = IO.pipe
+ unless runner = IO.popen("-".freeze)
+ er.close
+ status = true
+ GC.disable # avoid triggering CoW after forks
+ begin
+ $stderr.reopen($stdout)
+ trap(:QUIT) {}
+ parent = $$
+ 100.times do |i|
+ pid = fork {Process.kill(:QUIT, parent)}
+ IO.popen(ruby, 'r+'.freeze){}
+ Process.wait(pid)
+ $stdout.puts
+ $stdout.flush
+ end
+ ensure
+ if $!
+ ew.puts([Marshal.dump($!)].pack("m0"))
+ status = false
+ end
+ ew.close
+ exit!(status)
+ end
+ end
+ ew.close
+ begin
+ loop do
+ runner.wait_readable(5)
+ runner.read_nonblock(100, buf)
+ end
+ rescue EOFError => e
+ _, status = Process.wait2(runner.pid)
+ rescue IO::WaitReadable => e
+ Process.kill(:INT, runner.pid)
+ raise Marshal.load(er.read.unpack("m")[0])
end
+ assert_predicate(status, :success?)
ensure
- if $!
- ew.puts([Marshal.dump($!)].pack("m0"))
- status = false
+ er.close unless er.closed?
+ ew.close unless ew.closed?
+ if runner
+ begin
+ Process.kill(:TERM, runner.pid)
+ sleep 1
+ Process.kill(:KILL, runner.pid)
+ rescue Errno::ESRCH
+ end
+ runner.close
end
- ew.close
- exit!(status)
- end
- end
- ew.close
- begin
- loop do
- runner.wait_readable(5)
- runner.read_nonblock(100, buf)
end
- rescue EOFError => e
- _, status = Process.wait2(runner.pid)
- rescue IO::WaitReadable => e
- Process.kill(:INT, runner.pid)
- raise Marshal.load(er.read.unpack("m")[0])
- end
- assert_predicate(status, :success?)
- ensure
- er.close unless er.closed?
- ew.close unless ew.closed?
- if runner
- begin
- Process.kill(:TERM, runner.pid)
- sleep 1
- Process.kill(:KILL, runner.pid)
- rescue Errno::ESRCH
- end
- runner.close
- end
+ INPUT
end if defined?(fork)
def test_process_detach