io: minor tweaks to AsyncFd (#5932)

This commit is contained in:
Folkert de Vries
2023-08-14 19:13:14 +02:00
committed by GitHub
parent 40633fc678
commit 82bef00db4
+22 -31
View File
@@ -176,6 +176,8 @@ use std::{task::Context, task::Poll};
/// [`AsyncWrite`]: trait@crate::io::AsyncWrite /// [`AsyncWrite`]: trait@crate::io::AsyncWrite
pub struct AsyncFd<T: AsRawFd> { pub struct AsyncFd<T: AsRawFd> {
registration: Registration, registration: Registration,
// The inner value is always present. the Option is required for `drop` and `into_inner`.
// In all other methods `unwrap` is valid, and will never panic.
inner: Option<T>, inner: Option<T>,
} }
@@ -271,13 +273,12 @@ impl<T: AsRawFd> AsyncFd<T> {
} }
fn take_inner(&mut self) -> Option<T> { fn take_inner(&mut self) -> Option<T> {
let fd = self.inner.as_ref().map(AsRawFd::as_raw_fd); let inner = self.inner.take()?;
let fd = inner.as_raw_fd();
if let Some(fd) = fd { let _ = self.registration.deregister(&mut SourceFd(&fd));
let _ = self.registration.deregister(&mut SourceFd(&fd));
}
self.inner.take() Some(inner)
} }
/// Deregisters this file descriptor and returns ownership of the backing /// Deregisters this file descriptor and returns ownership of the backing
@@ -319,11 +320,10 @@ impl<T: AsRawFd> AsyncFd<T> {
) -> Poll<io::Result<AsyncFdReadyGuard<'a, T>>> { ) -> Poll<io::Result<AsyncFdReadyGuard<'a, T>>> {
let event = ready!(self.registration.poll_read_ready(cx))?; let event = ready!(self.registration.poll_read_ready(cx))?;
Ok(AsyncFdReadyGuard { Poll::Ready(Ok(AsyncFdReadyGuard {
async_fd: self, async_fd: self,
event: Some(event), event: Some(event),
}) }))
.into()
} }
/// Polls for read readiness. /// Polls for read readiness.
@@ -357,11 +357,10 @@ impl<T: AsRawFd> AsyncFd<T> {
) -> Poll<io::Result<AsyncFdReadyMutGuard<'a, T>>> { ) -> Poll<io::Result<AsyncFdReadyMutGuard<'a, T>>> {
let event = ready!(self.registration.poll_read_ready(cx))?; let event = ready!(self.registration.poll_read_ready(cx))?;
Ok(AsyncFdReadyMutGuard { Poll::Ready(Ok(AsyncFdReadyMutGuard {
async_fd: self, async_fd: self,
event: Some(event), event: Some(event),
}) }))
.into()
} }
/// Polls for write readiness. /// Polls for write readiness.
@@ -397,11 +396,10 @@ impl<T: AsRawFd> AsyncFd<T> {
) -> Poll<io::Result<AsyncFdReadyGuard<'a, T>>> { ) -> Poll<io::Result<AsyncFdReadyGuard<'a, T>>> {
let event = ready!(self.registration.poll_write_ready(cx))?; let event = ready!(self.registration.poll_write_ready(cx))?;
Ok(AsyncFdReadyGuard { Poll::Ready(Ok(AsyncFdReadyGuard {
async_fd: self, async_fd: self,
event: Some(event), event: Some(event),
}) }))
.into()
} }
/// Polls for write readiness. /// Polls for write readiness.
@@ -435,11 +433,10 @@ impl<T: AsRawFd> AsyncFd<T> {
) -> Poll<io::Result<AsyncFdReadyMutGuard<'a, T>>> { ) -> Poll<io::Result<AsyncFdReadyMutGuard<'a, T>>> {
let event = ready!(self.registration.poll_write_ready(cx))?; let event = ready!(self.registration.poll_write_ready(cx))?;
Ok(AsyncFdReadyMutGuard { Poll::Ready(Ok(AsyncFdReadyMutGuard {
async_fd: self, async_fd: self,
event: Some(event), event: Some(event),
}) }))
.into()
} }
/// Waits for any of the requested ready states, returning a /// Waits for any of the requested ready states, returning a
@@ -1013,14 +1010,11 @@ impl<'a, Inner: AsRawFd> AsyncFdReadyGuard<'a, Inner> {
) -> Result<io::Result<R>, TryIoError> { ) -> Result<io::Result<R>, TryIoError> {
let result = f(self.async_fd); let result = f(self.async_fd);
if let Err(e) = result.as_ref() {
if e.kind() == io::ErrorKind::WouldBlock {
self.clear_ready();
}
}
match result { match result {
Err(err) if err.kind() == io::ErrorKind::WouldBlock => Err(TryIoError(())), Err(err) if err.kind() == io::ErrorKind::WouldBlock => {
self.clear_ready();
Err(TryIoError(()))
}
result => Ok(result), result => Ok(result),
} }
} }
@@ -1193,14 +1187,11 @@ impl<'a, Inner: AsRawFd> AsyncFdReadyMutGuard<'a, Inner> {
) -> Result<io::Result<R>, TryIoError> { ) -> Result<io::Result<R>, TryIoError> {
let result = f(self.async_fd); let result = f(self.async_fd);
if let Err(e) = result.as_ref() {
if e.kind() == io::ErrorKind::WouldBlock {
self.clear_ready();
}
}
match result { match result {
Err(err) if err.kind() == io::ErrorKind::WouldBlock => Err(TryIoError(())), Err(err) if err.kind() == io::ErrorKind::WouldBlock => {
self.clear_ready();
Err(TryIoError(()))
}
result => Ok(result), result => Ok(result),
} }
} }