Bug #2008
closedtest_io.rb: test 2 fails on FreeBSD
Description
=begin
Hi,
Test 2 in test_io.rb fails on FreeBSD. This is related to http://redmine.ruby-lang.org/issues/show/1066, which, according to the comments posted after the bug was closed, wasn't really fixed.
I ran into this on Debian GNU/kfreebsd (Debian userland, freebsd kernel). One of our freebsd porter wrote (see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=543805):
The test assumes that the kernel buffer for pipes have fixed size.
It does not have to be true, there could be adaptive buffer size
provided by kernel. After filling whole kernel buffer (by non-blocking
write), it might be required to buffer becomes filled only from half
or even empty. The next write() might be blocked until whole
kernel buffer is read. Such behaviour of kernel is correct one.The kernel of FreeBSD uses adaptive pipe sizes and direct pipe writes,
see http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/sys_pipe.c
(It is likely to be the same on Mac OS X)
He suggests changing the test to:
begin
require "io/nonblock"
r, w = IO.pipe
w.nonblock = true
bytes = w.write_nonblock("a" * 100000)
w.nonblock = false
t1 = Thread.new { w.write("b" * 4096) }
t2 = Thread.new { w.write("c" * 4096) }
sleep 0.5
blocks = 2 + bytes/4096
blocks.times {
r.sysread(4096).length
sleep 0.1
}
t1.join
t2.join
rescue LoadError
end
However, I don't understand what that test is trying to test. It might be better to simply remove that test...
=end