diff options
Diffstat (limited to 'tokio/src/net/unix/listener.rs')
-rw-r--r-- | tokio/src/net/unix/listener.rs | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/tokio/src/net/unix/listener.rs b/tokio/src/net/unix/listener.rs index fc3c8710..dc8cb08e 100644 --- a/tokio/src/net/unix/listener.rs +++ b/tokio/src/net/unix/listener.rs @@ -2,7 +2,6 @@ use crate::future::poll_fn; use crate::io::PollEvented; use crate::net::unix::{Incoming, UnixStream}; -use mio::Ready; use std::convert::TryFrom; use std::fmt; use std::io; @@ -122,19 +121,19 @@ impl UnixListener { &mut self, cx: &mut Context<'_>, ) -> Poll<io::Result<(net::UnixStream, SocketAddr)>> { - ready!(self.io.poll_read_ready(cx, Ready::readable()))?; - - match self.io.get_ref().accept_std() { - Ok(None) => { - self.io.clear_read_ready(cx, Ready::readable())?; - Poll::Pending - } - Ok(Some((sock, addr))) => Ok((sock, addr)).into(), - Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => { - self.io.clear_read_ready(cx, Ready::readable())?; - Poll::Pending + loop { + let ev = ready!(self.io.poll_read_ready(cx))?; + + match self.io.get_ref().accept_std() { + Ok(None) => { + self.io.clear_readiness(ev); + } + Ok(Some((sock, addr))) => return Ok((sock, addr)).into(), + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => { + self.io.clear_readiness(ev); + } + Err(err) => return Err(err).into(), } - Err(err) => Err(err).into(), } } @@ -197,11 +196,6 @@ impl TryFrom<UnixListener> for mio_uds::UnixListener { type Error = io::Error; /// Consumes value, returning the mio I/O object. - /// - /// See [`PollEvented::into_inner`] for more details about - /// resource deregistration that happens during the call. - /// - /// [`PollEvented::into_inner`]: crate::io::PollEvented::into_inner fn try_from(value: UnixListener) -> Result<Self, Self::Error> { value.io.into_inner() } |