mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-09-28 12:10:37 +00:00
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>
This commit is contained in:
parent
90c2a510e2
commit
a43ec09b55
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user