summaryrefslogtreecommitdiff
path: root/test/-ext-
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-08-30 00:33:05 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-08-30 00:33:05 +0000
commit0cebfad20ab9eb694eeb95f083635127cfbf35f9 (patch)
tree702a719d30aede3531ae8f7b37d5438ca8bceea6 /test/-ext-
parentf3ef9346d1da0a4fdc1162e6c0832a38a7ea9f81 (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.rb69
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 00000000000..886ee70cfa9
--- /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