mirror of
https://github.com/ruby/ruby.git
synced 2025-08-28 15:36:16 +02:00
Add IO#timeout attribute and use it for blocking IO operations. (#5653)
This commit is contained in:
parent
e76217a7f3
commit
e4f91bbdba
Notes:
git
2022-10-07 17:49:02 +09:00
Merged-By: ioquatix <samuel@codeotaku.com>
17 changed files with 428 additions and 99 deletions
|
@ -3960,6 +3960,9 @@ __END__
|
|||
noex = Thread.new do # everything right and never see exceptions :)
|
||||
until sig_rd.wait_readable(0)
|
||||
IO.pipe do |r, w|
|
||||
assert_nil r.timeout
|
||||
assert_nil w.timeout
|
||||
|
||||
th = Thread.new { r.read(1) }
|
||||
w.write(dot)
|
||||
|
||||
|
|
64
test/ruby/test_io_timeout.rb
Normal file
64
test/ruby/test_io_timeout.rb
Normal file
|
@ -0,0 +1,64 @@
|
|||
# frozen_string_literal: false
|
||||
|
||||
require 'io/nonblock'
|
||||
|
||||
class TestIOTimeout < Test::Unit::TestCase
|
||||
def with_pipe
|
||||
omit "UNIXSocket is not defined!" unless defined?(UNIXSocket)
|
||||
|
||||
begin
|
||||
i, o = UNIXSocket.pair
|
||||
|
||||
unless i.nonblock? && o.nonblock?
|
||||
i.close
|
||||
o.close
|
||||
omit "I/O is not non-blocking!"
|
||||
end
|
||||
|
||||
yield i, o
|
||||
ensure
|
||||
i.close
|
||||
o.close
|
||||
end
|
||||
end
|
||||
|
||||
def test_timeout_attribute
|
||||
with_pipe do |i, o|
|
||||
assert_nil i.timeout
|
||||
|
||||
i.timeout = 10
|
||||
assert_equal 10, i.timeout
|
||||
assert_nil o.timeout
|
||||
|
||||
o.timeout = 20
|
||||
assert_equal 20, o.timeout
|
||||
assert_equal 10, i.timeout
|
||||
end
|
||||
end
|
||||
|
||||
def test_timeout_read_exception
|
||||
with_pipe do |i, o|
|
||||
i.timeout = 0.0001
|
||||
|
||||
assert_raise(IO::TimeoutError) {i.read}
|
||||
end
|
||||
end
|
||||
|
||||
def test_timeout_gets_exception
|
||||
with_pipe do |i, o|
|
||||
i.timeout = 0.0001
|
||||
|
||||
assert_raise(IO::TimeoutError) {i.gets}
|
||||
end
|
||||
end
|
||||
|
||||
def test_timeout_puts
|
||||
with_pipe do |i, o|
|
||||
i.timeout = 0.0001
|
||||
o.puts("Hello World")
|
||||
o.close
|
||||
|
||||
assert_equal "Hello World", i.gets.chomp
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue