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:
nobu 2012-11-21 13:40:00 +00:00
parent 7d0cabb8f8
commit e786aa711d
3 changed files with 81 additions and 0 deletions

View file

@ -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)