mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* thread.c (rb_thread_select): rewrite by using
rb_thread_fd_select(). old one is EINTR unsafe. Patch by Eric Wong. [Bug #5229] [ruby-core:39102] * test/-ext-/old_thread_select/test_old_thread_select.rb: a testcase for rb_thread_select(). * ext/-test-/old_thread_select/old_thread_select.c: ditto. * ext/-test-/old_thread_select/depend: ditto. * ext/-test-/old_thread_select/extconf.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33117 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f3ef9346d1
commit
0cebfad20a
6 changed files with 167 additions and 20 deletions
69
test/-ext-/old_thread_select/test_old_thread_select.rb
Normal file
69
test/-ext-/old_thread_select/test_old_thread_select.rb
Normal file
|
@ -0,0 +1,69 @@
|
|||
require 'test/unit'
|
||||
|
||||
class TestOldThreadSelect < Test::Unit::TestCase
|
||||
require '-test-/old_thread_select/old_thread_select'
|
||||
|
||||
def with_pipe
|
||||
r, w = IO.pipe
|
||||
begin
|
||||
yield r, w
|
||||
ensure
|
||||
r.close unless r.closed?
|
||||
w.close unless w.closed?
|
||||
end
|
||||
end
|
||||
|
||||
def test_old_select_read_timeout
|
||||
with_pipe do |r, w|
|
||||
t0 = Time.now
|
||||
rc = IO.old_thread_select([r.fileno], nil, nil, 0.001)
|
||||
diff = Time.now - t0
|
||||
assert_equal 0, rc
|
||||
assert diff > 0.001, "returned too early"
|
||||
end
|
||||
end
|
||||
|
||||
def test_old_select_read_write_check
|
||||
with_pipe do |r, w|
|
||||
w.syswrite('.')
|
||||
rc = IO.old_thread_select([r.fileno], nil, nil, nil)
|
||||
assert_equal 1, rc
|
||||
|
||||
rc = IO.old_thread_select([r.fileno], [w.fileno], nil, nil)
|
||||
assert_equal 2, rc
|
||||
|
||||
assert_equal '.', r.read(1)
|
||||
|
||||
rc = IO.old_thread_select([r.fileno], [w.fileno], nil, nil)
|
||||
assert_equal 1, rc
|
||||
end
|
||||
end
|
||||
|
||||
def test_old_select_signal_safe
|
||||
return unless Process.respond_to?(:kill)
|
||||
usr1 = false
|
||||
trap(:USR1) { usr1 = true }
|
||||
main = Thread.current
|
||||
thr = Thread.new do
|
||||
Thread.pass until main.stop?
|
||||
Process.kill(:USR1, $$)
|
||||
true
|
||||
end
|
||||
|
||||
rc = nil
|
||||
t0 = Time.now
|
||||
with_pipe do |r,w|
|
||||
assert_nothing_raised do
|
||||
rc = IO.old_thread_select([r.fileno], nil, nil, 1)
|
||||
end
|
||||
end
|
||||
|
||||
diff = Time.now - t0
|
||||
assert diff >= 1.0, "interrupted or short wait"
|
||||
assert_equal 0, rc
|
||||
assert_equal true, thr.value
|
||||
assert usr1, "USR1 not received"
|
||||
ensure
|
||||
trap(:USR1, "DEFAULT")
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue