mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +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> {
|
impl<T: AsRawFd> Drop for AsyncFd<T> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if let Some(driver) = self.handle.inner() {
|
let _ = self.take_inner();
|
||||||
if let Some(inner) = self.inner.as_ref() {
|
|
||||||
let fd = inner.as_raw_fd();
|
|
||||||
let _ = driver.deregister_source(&mut SourceFd(&fd));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,10 +225,20 @@ impl<T: AsRawFd> AsyncFd<T> {
|
|||||||
self.inner.as_mut().unwrap()
|
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
|
/// Deregisters this file descriptor, and returns ownership of the backing
|
||||||
/// object.
|
/// object.
|
||||||
pub fn into_inner(mut self) -> T {
|
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
|
/// 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
|
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]
|
#[tokio::test]
|
||||||
async fn with_poll() {
|
async fn with_poll() {
|
||||||
use std::task::Poll;
|
use std::task::Poll;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user