From a43ec09b55363374221aa3214fe0cec3d6712b6c Mon Sep 17 00:00:00 2001 From: bdonlan Date: Sat, 7 Nov 2020 01:12:06 -0800 Subject: async_fd: make into_inner() deregister the fd (#3104) * async_fd: make into_inner() deregister the fd Fixes: #3103 * make clippy happy Co-authored-by: Bryan Donlan --- tokio/src/io/async_fd.rs | 19 ++++++++++++------- tokio/tests/io_async_fd.rs | 9 +++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/tokio/src/io/async_fd.rs b/tokio/src/io/async_fd.rs index e5ad2ab4..14c29f41 100644 --- a/tokio/src/io/async_fd.rs +++ b/tokio/src/io/async_fd.rs @@ -177,12 +177,7 @@ impl<'a, Inner: AsRawFd> AsyncFdReadyGuard<'a, Inner> { impl Drop for AsyncFd { fn drop(&mut self) { - if let Some(driver) = self.handle.inner() { - if let Some(inner) = self.inner.as_ref() { - let fd = inner.as_raw_fd(); - let _ = driver.deregister_source(&mut SourceFd(&fd)); - } - } + let _ = self.take_inner(); } } @@ -230,10 +225,20 @@ impl AsyncFd { self.inner.as_mut().unwrap() } + fn take_inner(&mut self) -> Option { + let fd = self.inner.as_ref().map(AsRawFd::as_raw_fd); + if let Some(fd) = fd { + if let Some(driver) = self.handle.inner() { + let _ = driver.deregister_source(&mut SourceFd(&fd)); + } + } + self.inner.take() + } + /// Deregisters this file descriptor, and returns ownership of the backing /// object. pub fn into_inner(mut self) -> T { - self.inner.take().unwrap() + self.take_inner().unwrap() } /// Polls for read readiness. This function retains the waker for the last diff --git a/tokio/tests/io_async_fd.rs b/tokio/tests/io_async_fd.rs index 0303eff6..f3b89b35 100644 --- a/tokio/tests/io_async_fd.rs +++ b/tokio/tests/io_async_fd.rs @@ -303,6 +303,15 @@ async fn drop_closes() { std::mem::drop(arc_fd); // suppress unnecessary clone clippy warning } +#[tokio::test] +async fn reregister() { + let (a, _b) = socketpair(); + + let afd_a = AsyncFd::new(a).unwrap(); + let a = afd_a.into_inner(); + AsyncFd::new(a).unwrap(); +} + #[tokio::test] async fn with_poll() { use std::task::Poll; -- cgit v1.2.3