diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-30 00:33:05 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-30 00:33:05 +0000 |
commit | 0cebfad20ab9eb694eeb95f083635127cfbf35f9 (patch) | |
tree | 702a719d30aede3531ae8f7b37d5438ca8bceea6 /test/-ext- | |
parent | f3ef9346d1da0a4fdc1162e6c0832a38a7ea9f81 (diff) |
* 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
Diffstat (limited to 'test/-ext-')
-rw-r--r-- | test/-ext-/old_thread_select/test_old_thread_select.rb | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/test/-ext-/old_thread_select/test_old_thread_select.rb b/test/-ext-/old_thread_select/test_old_thread_select.rb new file mode 100644 index 0000000000..886ee70cfa --- /dev/null +++ b/test/-ext-/old_thread_select/test_old_thread_select.rb @@ -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 |