mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
socket: fix BasicSocket#*_nonblock buffering bugs from r58400
IO#read_nonblock and IO#write_nonblock take into account buffered data, so the Linux-only BasicSocket#read_nonblock and BasicSocket#write_nonblock methods must, too. This bug was only introduced in r58400 ("socket: avoid fcntl for read/write_nonblock on Linux") and does not affect any stable release. * ext/socket/basicsocket.c (rsock_init_basicsocket): * ext/socket/init.c (rsock_s_recvfrom_nonblock): * ext/socket/init.c (rsock_init_socket_init): * ext/socket/lib/socket.rb (def read_nonblock): * ext/socket/lib/socket.rb (def write_nonblock): * ext/socket/rubysocket.h (static inline void rsock_maybe_wait_fd): * test/socket/test_basicsocket.rb (def test_read_write_nonblock): [Feature #13362] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60496 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c3bbc2ffd5
commit
ba5eb6458a
5 changed files with 139 additions and 7 deletions
|
@ -205,4 +205,25 @@ class TestSocket_BasicSocket < Test::Unit::TestCase
|
|||
assert_not_predicate(ssock, :nonblock?) unless set_nb
|
||||
end
|
||||
end
|
||||
|
||||
def test_read_nonblock_mix_buffered
|
||||
socks do |sserv, ssock, csock|
|
||||
ssock.write("hello\nworld\n")
|
||||
assert_equal "hello\n", csock.gets
|
||||
IO.select([csock], nil, nil, 10) or
|
||||
flunk 'socket did not become readable'
|
||||
assert_equal "world\n", csock.read_nonblock(8)
|
||||
end
|
||||
end
|
||||
|
||||
def test_write_nonblock_buffered
|
||||
socks do |sserv, ssock, csock|
|
||||
ssock.sync = false
|
||||
ssock.write("h")
|
||||
assert_equal :wait_readable, csock.read_nonblock(1, exception: false)
|
||||
assert_equal 4, ssock.write_nonblock("ello")
|
||||
ssock.close
|
||||
assert_equal "hello", csock.read(5)
|
||||
end
|
||||
end
|
||||
end if defined?(BasicSocket)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue