Skip to content

Commit

Permalink
async_fd: make into_inner() deregister the fd (#3104)
Browse files Browse the repository at this point in the history
* async_fd: make into_inner() deregister the fd

Fixes: #3103

* make clippy happy

Co-authored-by: Bryan Donlan <bdonlan@amazon.com>
  • Loading branch information
bdonlan and Bryan Donlan committed Nov 7, 2020
1 parent 90c2a51 commit a43ec09
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
19 changes: 12 additions & 7 deletions tokio/src/io/async_fd.rs
Expand Up @@ -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();
}
}

Expand Down Expand Up @@ -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
Expand Down
9 changes: 9 additions & 0 deletions tokio/tests/io_async_fd.rs
Expand Up @@ -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;
Expand Down

0 comments on commit a43ec09

Please sign in to comment.