Io_splice 4.0.0 - zero-copy pipe I/O for Linux and Ruby

The splice family of Linux system calls can transfer data between file
descriptors without the need to copy data into userspace. Instead of a
userspace buffer, they rely on an ordinary Unix pipe as a kernel-level
buffer.

Changes:

Now easier to use!

Methods now automatically retry on EINTR after checking
IO#closed? and executing interrupts.

There is a new IO::Splice::WAITALL flag (implemented in
userspace) which may be used to cause IO.splice and IO.tee
to retry (while the GVL is released) until the operation
is complete.

IO::Splice.copy_stream now works correctly for large copies
if source offset is specified.

MRI 1.8 is only weakly supported now, MRI 1.9 is the
preferred platform though Rubinius appears to work, too.

I just pushed out 4.1.0 with one enhancement on top of 4.0.0:

IO::Splice.copy_stream coerces based on the availability of
the #to_path method in source and destination arguments.

This is to be compatible with IO.copy_stream and also
Rack::File since this may be used in web servers.

This is NOT visible with Ruby 1.8 since File.open
doesn’t coerce with #to_path on the given object.

OK, I really hope this is the last release in a while :>

IO::Splice.copy_stream now uses SPLICE_F_NONBLOCK whenever the
destination is a pipe. Our documentation is also updated to
reflect the issue of splicing from sockets into pipes.

Or better yet, read this thread: LKML: Eric Dumazet: Re: maximum buffer size for splice(2) tcp->pipe?