From eacd28219bb9a16adb1d0ebfe0ed6ce42c6971b1 Mon Sep 17 00:00:00 2001 From: Masahiro Kozuka Date: Wed, 23 Mar 2022 20:06:34 +0900 Subject: [PATCH 1/3] tokio: make try_io methods call mio's try_io internally A user defined I/O closure should be called by mio's try_io to ensure that the I/O receives more events if it hits a WouldBlock error. Fixes: #4510 --- tokio/src/net/tcp/stream.rs | 2 +- tokio/src/net/udp.rs | 2 +- tokio/src/net/unix/datagram/socket.rs | 2 +- tokio/src/net/unix/stream.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tokio/src/net/tcp/stream.rs b/tokio/src/net/tcp/stream.rs index ebb67b84d16..ab0b51e33f2 100644 --- a/tokio/src/net/tcp/stream.rs +++ b/tokio/src/net/tcp/stream.rs @@ -968,7 +968,7 @@ impl TcpStream { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, f) + self.io.registration().try_io(interest, || self.io.try_io(f)) } /// Receives data on the socket from the remote address to which it is diff --git a/tokio/src/net/udp.rs b/tokio/src/net/udp.rs index 12af5152c28..baf53456857 100644 --- a/tokio/src/net/udp.rs +++ b/tokio/src/net/udp.rs @@ -1272,7 +1272,7 @@ impl UdpSocket { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, f) + self.io.registration().try_io(interest, || self.io.try_io(f)) } /// Receives data from the socket, without removing it from the input queue. diff --git a/tokio/src/net/unix/datagram/socket.rs b/tokio/src/net/unix/datagram/socket.rs index d5b618663dc..0f763536b51 100644 --- a/tokio/src/net/unix/datagram/socket.rs +++ b/tokio/src/net/unix/datagram/socket.rs @@ -1241,7 +1241,7 @@ impl UnixDatagram { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, f) + self.io.registration().try_io(interest, || self.io.try_io(f)) } /// Returns the local address that this socket is bound to. diff --git a/tokio/src/net/unix/stream.rs b/tokio/src/net/unix/stream.rs index 4e7ef87b416..95996d94fee 100644 --- a/tokio/src/net/unix/stream.rs +++ b/tokio/src/net/unix/stream.rs @@ -685,7 +685,7 @@ impl UnixStream { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, f) + self.io.registration().try_io(interest, || self.io.try_io(f)) } /// Creates new `UnixStream` from a `std::os::unix::net::UnixStream`. From edf8d998e860a72e84ee1ea8d62cd0a64ff30887 Mon Sep 17 00:00:00 2001 From: Masahiro Kozuka Date: Sun, 27 Mar 2022 12:20:30 +0900 Subject: [PATCH 2/3] set minimum mio version to 0.8.1 --- tokio/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokio/Cargo.toml b/tokio/Cargo.toml index ba165d2556c..90a32d98164 100644 --- a/tokio/Cargo.toml +++ b/tokio/Cargo.toml @@ -97,7 +97,7 @@ pin-project-lite = "0.2.0" bytes = { version = "1.0.0", optional = true } once_cell = { version = "1.5.2", optional = true } memchr = { version = "2.2", optional = true } -mio = { version = "0.8.0", optional = true } +mio = { version = "0.8.1", optional = true } socket2 = { version = "0.4.4", optional = true, features = [ "all" ] } num_cpus = { version = "1.8.0", optional = true } parking_lot = { version = "0.12.0", optional = true } From 2ef5217f5f3a36215549f79886106b12bf42c968 Mon Sep 17 00:00:00 2001 From: Masahiro Kozuka Date: Sun, 27 Mar 2022 21:30:39 +0900 Subject: [PATCH 3/3] fix fmt --- tokio/src/net/tcp/stream.rs | 4 +++- tokio/src/net/udp.rs | 4 +++- tokio/src/net/unix/datagram/socket.rs | 4 +++- tokio/src/net/unix/stream.rs | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/tokio/src/net/tcp/stream.rs b/tokio/src/net/tcp/stream.rs index ab0b51e33f2..5228e1bc242 100644 --- a/tokio/src/net/tcp/stream.rs +++ b/tokio/src/net/tcp/stream.rs @@ -968,7 +968,9 @@ impl TcpStream { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, || self.io.try_io(f)) + self.io + .registration() + .try_io(interest, || self.io.try_io(f)) } /// Receives data on the socket from the remote address to which it is diff --git a/tokio/src/net/udp.rs b/tokio/src/net/udp.rs index baf53456857..eea6164b177 100644 --- a/tokio/src/net/udp.rs +++ b/tokio/src/net/udp.rs @@ -1272,7 +1272,9 @@ impl UdpSocket { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, || self.io.try_io(f)) + self.io + .registration() + .try_io(interest, || self.io.try_io(f)) } /// Receives data from the socket, without removing it from the input queue. diff --git a/tokio/src/net/unix/datagram/socket.rs b/tokio/src/net/unix/datagram/socket.rs index 0f763536b51..def006c4761 100644 --- a/tokio/src/net/unix/datagram/socket.rs +++ b/tokio/src/net/unix/datagram/socket.rs @@ -1241,7 +1241,9 @@ impl UnixDatagram { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, || self.io.try_io(f)) + self.io + .registration() + .try_io(interest, || self.io.try_io(f)) } /// Returns the local address that this socket is bound to. diff --git a/tokio/src/net/unix/stream.rs b/tokio/src/net/unix/stream.rs index 95996d94fee..fe2d825bf98 100644 --- a/tokio/src/net/unix/stream.rs +++ b/tokio/src/net/unix/stream.rs @@ -685,7 +685,9 @@ impl UnixStream { interest: Interest, f: impl FnOnce() -> io::Result, ) -> io::Result { - self.io.registration().try_io(interest, || self.io.try_io(f)) + self.io + .registration() + .try_io(interest, || self.io.try_io(f)) } /// Creates new `UnixStream` from a `std::os::unix::net::UnixStream`.