1
0
Fork 0
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:
normal 2017-10-27 23:26:48 +00:00
parent c3bbc2ffd5
commit ba5eb6458a
5 changed files with 139 additions and 7 deletions

View file

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