summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbdonlan <bdonlan@gmail.com>2020-11-07 01:12:06 -0800
committerGitHub <noreply@github.com>2020-11-07 10:12:06 +0100
commita43ec09b55363374221aa3214fe0cec3d6712b6c (patch)
treef0b3d3c388580dc79fe35e72c460aa7cea2c8aac
parent90c2a510e28a05cc72f76eb5e8bd4a7f7751e333 (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.rs19
-rw-r--r--tokio/tests/io_async_fd.rs9
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;