mirror of
https://github.com/ruby/ruby.git
synced 2025-09-18 01:54:00 +02:00
io/wait: add IO#wait_writable method
* ext/io/wait/wait.c (io_wait_writable): this is easier to use than IO.select for a single IO object and is immune to the limitations/innefficiency of select() on platforms where poll/ppoll is available. patched by Eric Wong. [Feature #4646] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37785 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7d0cabb8f8
commit
e786aa711d
3 changed files with 81 additions and 0 deletions
|
@ -1,3 +1,4 @@
|
|||
# -*- coding: us-ascii -*-
|
||||
require 'test/unit'
|
||||
require 'timeout'
|
||||
require 'socket'
|
||||
|
@ -69,4 +70,39 @@ class TestIOWait < Test::Unit::TestCase
|
|||
Thread.new { sleep 0.01; @w.close }
|
||||
assert_nil @r.wait
|
||||
end
|
||||
|
||||
def test_wait_writable
|
||||
assert_equal @w, @w.wait_writable
|
||||
end
|
||||
|
||||
def test_wait_writable_timeout
|
||||
assert_equal @w, @w.wait_writable(0.001)
|
||||
written = fill_pipe
|
||||
assert_nil @w.wait_writable(0.001)
|
||||
@r.read(written)
|
||||
assert_equal @w, @w.wait_writable(0.001)
|
||||
end
|
||||
|
||||
def test_wait_writable_EPIPE
|
||||
fill_pipe
|
||||
@r.close
|
||||
assert_equal @w, @w.wait_writable
|
||||
end
|
||||
|
||||
def test_wait_writable_closed
|
||||
@w.close
|
||||
assert_raises(IOError) { @w.wait_writable }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def fill_pipe
|
||||
written = 0
|
||||
buf = " " * 4096
|
||||
begin
|
||||
written += @w.write_nonblock(buf)
|
||||
rescue Errno::EAGAIN
|
||||
return written
|
||||
end while true
|
||||
end
|
||||
end if IO.method_defined?(:wait)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue