summaryrefslogtreecommitdiffstats
path: root/tokio/src/net
diff options
context:
space:
mode:
authorSean McArthur <sean@seanmonstar.com>2020-11-18 10:41:47 -0800
committerGitHub <noreply@github.com>2020-11-18 10:41:47 -0800
commit34fcef258b84d17f8d418b39eb61fa07fa87c390 (patch)
tree98e37fc2d6fa541a9e499331df86ba3d1b7b6e3a /tokio/src/net
parent7d11aa866837eea50a6f1e0ef7e24846a653cbf1 (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.rs12
-rw-r--r--tokio/src/net/tcp/split_owned.rs12
-rw-r--r--tokio/src/net/tcp/stream.rs20
-rw-r--r--tokio/src/net/unix/split.rs12
-rw-r--r--tokio/src/net/unix/split_owned.rs12
-rw-r--r--tokio/src/net/unix/stream.rs22
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 {