Project

General

Profile

Backport #5661 » 0001-random.c-random_s_rand-avoid-segfault-after-fork-rub.patch

normalperson (Eric Wong), 11/23/2011 05:45 AM

View differences:

random.c
static VALUE
random_s_rand(int argc, VALUE *argv, VALUE obj)
{
rand_start(&default_rand);
return random_rand(argc, argv, rb_Random_DEFAULT);
}
test/ruby/test_rand.rb
rescue NotImplementedError, ArgumentError
end
def fork_check(op = nil, &block)
r, w = IO.pipe
p1 = fork { w.puts(block.call.to_s) }
_, st = Process.waitpid2(p1)
assert st.success?, st.inspect
r1 = r.gets
p2 = fork { w.puts(block.call.to_s) }
_, st = Process.waitpid2(p2)
assert st.success?, st.inspect
r2 = r.gets
# technically, it *is* possible to fail this test _very_ rarely...
assert_operator(r1.strip, op, r2.strip) if op
rescue NotImplementedError
ensure
r.close if r
w.close if w
end
def test_rand_reseed_on_fork
# Bug 5661 / [ruby-core:41209]
fork_check { Random.rand(4) }
fork_check(:!=) { Random.rand }
fork_check { rand(4) }
fork_check(:!=) { rand }
stable = Random.new
fork_check(:==) { stable.rand(4) }
fork_check(:==) { stable.rand }
end
def test_seed
bug3104 = '[ruby-core:29292]'
rand_1 = Random.new(-1).rand
(2-2/2)