diff options
author | Sean McArthur <sean@seanmonstar.com> | 2020-11-18 10:41:47 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-18 10:41:47 -0800 |
commit | 34fcef258b84d17f8d418b39eb61fa07fa87c390 (patch) | |
tree | 98e37fc2d6fa541a9e499331df86ba3d1b7b6e3a /tokio/src/net | |
parent | 7d11aa866837eea50a6f1e0ef7e24846a653cbf1 (diff) |
io: add vectored writes to `AsyncWrite` (#3149)
This adds `AsyncWrite::poll_write_vectored`, and implements it for
`TcpStream` and `UnixStream`.
Refs: #3135.
Diffstat (limited to 'tokio/src/net')
-rw-r--r-- | tokio/src/net/tcp/split.rs | 12 | ||||
-rw-r--r-- | tokio/src/net/tcp/split_owned.rs | 12 | ||||
-rw-r--r-- | tokio/src/net/tcp/stream.rs | 20 | ||||
-rw-r--r-- | tokio/src/net/unix/split.rs | 12 | ||||
-rw-r--r-- | tokio/src/net/unix/split_owned.rs | 12 | ||||
-rw-r--r-- | tokio/src/net/unix/stream.rs | 22 |
6 files changed, 89 insertions, 1 deletions
diff --git a/tokio/src/net/tcp/split.rs b/tokio/src/net/tcp/split.rs index 9a257f8b..28c94eb4 100644 --- a/tokio/src/net/tcp/split.rs +++ b/tokio/src/net/tcp/split.rs @@ -147,6 +147,18 @@ impl AsyncWrite for WriteHalf<'_> { self.0.poll_write_priv(cx, buf) } + fn poll_write_vectored( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.0.poll_write_vectored_priv(cx, bufs) + } + + fn is_write_vectored(&self) -> bool { + self.0.is_write_vectored() + } + #[inline] fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { // tcp flush is a no-op diff --git a/tokio/src/net/tcp/split_owned.rs b/tokio/src/net/tcp/split_owned.rs index 4b4e2636..8d77c8ca 100644 --- a/tokio/src/net/tcp/split_owned.rs +++ b/tokio/src/net/tcp/split_owned.rs @@ -229,6 +229,18 @@ impl AsyncWrite for OwnedWriteHalf { self.inner.poll_write_priv(cx, buf) } + fn poll_write_vectored( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.inner.poll_write_vectored_priv(cx, bufs) + } + + fn is_write_vectored(&self) -> bool { + self.inner.is_write_vectored() + } + #[inline] fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { // tcp flush is a no-op diff --git a/tokio/src/net/tcp/stream.rs b/tokio/src/net/tcp/stream.rs index de7b4213..28118f73 100644 --- a/tokio/src/net/tcp/stream.rs +++ b/tokio/src/net/tcp/stream.rs @@ -832,6 +832,14 @@ impl TcpStream { ) -> Poll<io::Result<usize>> { self.io.poll_write(cx, buf) } + + pub(super) fn poll_write_vectored_priv( + &self, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.io.poll_write_vectored(cx, bufs) + } } impl TryFrom<std::net::TcpStream> for TcpStream { @@ -867,6 +875,18 @@ impl AsyncWrite for TcpStream { self.poll_write_priv(cx, buf) } + fn poll_write_vectored( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.poll_write_vectored_priv(cx, bufs) + } + + fn is_write_vectored(&self) -> bool { + true + } + #[inline] fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { // tcp flush is a no-op diff --git a/tokio/src/net/unix/split.rs b/tokio/src/net/unix/split.rs index 460bbc19..af9c7624 100644 --- a/tokio/src/net/unix/split.rs +++ b/tokio/src/net/unix/split.rs @@ -68,6 +68,18 @@ impl AsyncWrite for WriteHalf<'_> { self.0.poll_write_priv(cx, buf) } + fn poll_write_vectored( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.0.poll_write_vectored_priv(cx, bufs) + } + + fn is_write_vectored(&self) -> bool { + self.0.is_write_vectored() + } + fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { Poll::Ready(Ok(())) } diff --git a/tokio/src/net/unix/split_owned.rs b/tokio/src/net/unix/split_owned.rs index ab233072..5f0a2593 100644 --- a/tokio/src/net/unix/split_owned.rs +++ b/tokio/src/net/unix/split_owned.rs @@ -153,6 +153,18 @@ impl AsyncWrite for OwnedWriteHalf { self.inner.poll_write_priv(cx, buf) } + fn poll_write_vectored( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.inner.poll_write_vectored_priv(cx, bufs) + } + + fn is_write_vectored(&self) -> bool { + self.inner.is_write_vectored() + } + #[inline] fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { // flush is a no-op diff --git a/tokio/src/net/unix/stream.rs b/tokio/src/net/unix/stream.rs index 1d840926..f9619942 100644 --- a/tokio/src/net/unix/stream.rs +++ b/tokio/src/net/unix/stream.rs @@ -172,6 +172,18 @@ impl AsyncWrite for UnixStream { self.poll_write_priv(cx, buf) } + fn poll_write_vectored( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.poll_write_vectored_priv(cx, bufs) + } + + fn is_write_vectored(&self) -> bool { + true + } + fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { Poll::Ready(Ok(())) } @@ -199,7 +211,7 @@ impl UnixStream { cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<io::Result<()>> { - // Safety: `UdpStream::read` correctly handles reads into uninitialized memory + // Safety: `UnixStream::read` correctly handles reads into uninitialized memory unsafe { self.io.poll_read(cx, buf) } } @@ -210,6 +222,14 @@ impl UnixStream { ) -> Poll<io::Result<usize>> { self.io.poll_write(cx, buf) } + + pub(super) fn poll_write_vectored_priv( + &self, + cx: &mut Context<'_>, + bufs: &[io::IoSlice<'_>], + ) -> Poll<io::Result<usize>> { + self.io.poll_write_vectored(cx, bufs) + } } impl fmt::Debug for UnixStream { |