diff options
| author | Steven Fackler <sfackler@gmail.com> | 2020-01-03 11:26:05 -0800 |
|---|---|---|
| committer | Steven Fackler <sfackler@gmail.com> | 2020-04-26 04:23:39 -0700 |
| commit | 15262ec6be6fcfc9f27e174a0714d5a62e775fb0 (patch) | |
| tree | a962ae80ff3cbdb331c76426c200cdec0d82219c /src/libstd/net | |
| parent | 019ab732ce63a117cbb446db1488916c5c0bd2a7 (diff) | |
| download | rust-15262ec6be6fcfc9f27e174a0714d5a62e775fb0.tar.gz rust-15262ec6be6fcfc9f27e174a0714d5a62e775fb0.zip | |
Add Read/Write::can_read/write_vectored
When working with an arbitrary reader or writer, code that uses vectored operations may end up being slower than code that copies into a single buffer when the underlying reader or writer doesn't actually support vectored operations. These new methods allow you to ask the reader or witer up front if vectored operations are efficiently supported. Currently, you have to use some heuristics to guess by e.g. checking if the read or write only accessed the first buffer. Hyper is one concrete example of a library that has to do this dynamically: https://github.com/hyperium/hyper/blob/0eaf304644a396895a4ce1f0146e596640bb666a/src/proto/h1/io.rs#L582-L594
Diffstat (limited to 'src/libstd/net')
| -rw-r--r-- | src/libstd/net/tcp.rs | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libstd/net/tcp.rs b/src/libstd/net/tcp.rs index 5023d692408..86955a79759 100644 --- a/src/libstd/net/tcp.rs +++ b/src/libstd/net/tcp.rs @@ -577,6 +577,11 @@ impl Read for TcpStream { } #[inline] + fn can_read_vectored(&self) -> bool { + self.0.can_read_vectored() + } + + #[inline] unsafe fn initializer(&self) -> Initializer { Initializer::nop() } @@ -591,6 +596,11 @@ impl Write for TcpStream { self.0.write_vectored(bufs) } + #[inline] + fn can_write_vectored(&self) -> bool { + self.0.can_write_vectored() + } + fn flush(&mut self) -> io::Result<()> { Ok(()) } @@ -606,6 +616,11 @@ impl Read for &TcpStream { } #[inline] + fn can_read_vectored(&self) -> bool { + self.0.can_read_vectored() + } + + #[inline] unsafe fn initializer(&self) -> Initializer { Initializer::nop() } @@ -620,6 +635,11 @@ impl Write for &TcpStream { self.0.write_vectored(bufs) } + #[inline] + fn can_write_vectored(&self) -> bool { + self.0.can_write_vectored() + } + fn flush(&mut self) -> io::Result<()> { Ok(()) } |
