diff options
author | bdonlan <bdonlan@gmail.com> | 2020-11-07 01:12:06 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-07 10:12:06 +0100 |
commit | a43ec09b55363374221aa3214fe0cec3d6712b6c (patch) | |
tree | f0b3d3c388580dc79fe35e72c460aa7cea2c8aac | |
parent | 90c2a510e28a05cc72f76eb5e8bd4a7f7751e333 (diff) |
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 <bdonlan@amazon.com>
-rw-r--r-- | tokio/src/io/async_fd.rs | 19 | ||||
-rw-r--r-- | 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<T: AsRawFd> Drop for AsyncFd<T> { 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<T: AsRawFd> AsyncFd<T> { self.inner.as_mut().unwrap() } + fn take_inner(&mut self) -> Option<T> { + 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 @@ -304,6 +304,15 @@ async fn drop_closes() { } #[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; |