From e658c7e56eb36d6cffc66d171582e61c6761abc7 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Mon, 27 Feb 2023 18:54:20 -0500 Subject: [PATCH 1/4] Add implementations of AsFd/AsHandle/AsSocket --- tokio/build.rs | 11 +++++++ tokio/src/fs/file.rs | 18 +++++++++++ tokio/src/net/tcp/listener.rs | 21 ++++++++++++ tokio/src/net/tcp/socket.rs | 18 +++++++++++ tokio/src/net/tcp/stream.rs | 21 ++++++++++++ tokio/src/net/udp.rs | 16 +++++++++- tokio/src/net/unix/datagram/socket.rs | 9 ++++++ tokio/src/net/unix/listener.rs | 9 ++++++ tokio/src/net/unix/pipe.rs | 16 ++++++++++ tokio/src/net/unix/stream.rs | 9 ++++++ tokio/src/process/mod.rs | 46 +++++++++++++++++++++++++++ tokio/src/process/unix/mod.rs | 16 ++++++++++ 12 files changed, 209 insertions(+), 1 deletion(-) diff --git a/tokio/build.rs b/tokio/build.rs index ddade2876bb..2444f48e586 100644 --- a/tokio/build.rs +++ b/tokio/build.rs @@ -43,6 +43,7 @@ fn main() { let mut enable_addr_of = false; let mut enable_target_has_atomic = false; let mut enable_const_mutex_new = false; + let mut enable_as_fd = false; let mut target_needs_atomic_u64_fallback = false; match AutoCfg::new() { @@ -106,6 +107,7 @@ fn main() { // The `Mutex::new` method was made const in 1.63. if ac.probe_rustc_version(1, 64) { enable_const_mutex_new = true; + enable_as_fd = true; } else if ac.probe_rustc_version(1, 63) { // This compiler claims to be 1.63, but there are some nightly // compilers that claim to be 1.63 without supporting the @@ -115,6 +117,7 @@ fn main() { // The oldest nightly that supports the feature is 2022-06-20. if ac.probe_expression(CONST_MUTEX_NEW_PROBE) { enable_const_mutex_new = true; + enable_as_fd = true; } } } @@ -162,6 +165,14 @@ fn main() { autocfg::emit("tokio_no_const_mutex_new") } + if !enable_as_fd { + // To disable this feature on compilers that support it, you can + // explicitly pass this flag with the following environment variable: + // + // RUSTFLAGS="--cfg tokio_no_as_fd" + autocfg::emit("tokio_no_as_fd"); + } + if target_needs_atomic_u64_fallback { // To disable this feature on compilers that support it, you can // explicitly pass this flag with the following environment variable: diff --git a/tokio/src/fs/file.rs b/tokio/src/fs/file.rs index d513beb05a4..96a0a38b252 100644 --- a/tokio/src/fs/file.rs +++ b/tokio/src/fs/file.rs @@ -725,6 +725,13 @@ impl std::os::unix::io::AsRawFd for File { } } +#[cfg(all(unix, not(tokio_no_as_fd)))] +impl std::os::fd::AsFd for File { + fn as_fd(&self) -> std::os::fd::BorrowedFd<'_> { + unsafe { std::os::fd::BorrowedFd::borrow_raw(std::os::unix::io::AsRawFd::as_raw_fd(self)) } + } +} + #[cfg(unix)] impl std::os::unix::io::FromRawFd for File { unsafe fn from_raw_fd(fd: std::os::unix::io::RawFd) -> Self { @@ -739,6 +746,17 @@ impl std::os::windows::io::AsRawHandle for File { } } +#[cfg(all(windows, not(tokio_no_as_fd)))] +impl std::os::windows::io::AsHandle { + fn as_handle(&self) -> std::os::windows::io::BorrowedHandle<'_> { + unsafe { + std::os::windows::io::BorrowedHandle::borrow_raw( + std::os::windows::io::AsRawHandle::as_raw_handle(self), + ) + } + } +} + #[cfg(windows)] impl std::os::windows::io::FromRawHandle for File { unsafe fn from_raw_handle(handle: std::os::windows::io::RawHandle) -> Self { diff --git a/tokio/src/net/tcp/listener.rs b/tokio/src/net/tcp/listener.rs index 4441313703e..acde211968b 100644 --- a/tokio/src/net/tcp/listener.rs +++ b/tokio/src/net/tcp/listener.rs @@ -407,6 +407,13 @@ mod sys { self.io.as_raw_fd() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for TcpListener { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } } cfg_unstable! { @@ -420,6 +427,13 @@ cfg_unstable! { self.io.as_raw_fd() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for TcpListener { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } } } @@ -433,4 +447,11 @@ mod sys { self.io.as_raw_socket() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsSocket for UdpSocket { + fn as_socket(&self) -> BorrowedSocket<'_> { + unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) } + } + } } diff --git a/tokio/src/net/tcp/socket.rs b/tokio/src/net/tcp/socket.rs index 09349fe53eb..93f5585dcf8 100644 --- a/tokio/src/net/tcp/socket.rs +++ b/tokio/src/net/tcp/socket.rs @@ -4,10 +4,14 @@ use std::fmt; use std::io; use std::net::SocketAddr; +#[cfg(all(unix, not(tokio_no_as_fd)))] +use std::os::fd::{AsFd, BorrowedFd}; #[cfg(unix)] use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; #[cfg(windows)] use std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket}; +#[cfg(all(windows, not(tokio_no_as_fd)))] +use std::os::windows::io::{AsSocket, BorrowedSocket}; use std::time::Duration; cfg_net! { @@ -737,6 +741,13 @@ impl AsRawFd for TcpSocket { } } +#[cfg(all(unix, not(tokio_no_as_fd)))] +impl AsFd for TcpSocket { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} + #[cfg(unix)] impl FromRawFd for TcpSocket { /// Converts a `RawFd` to a `TcpSocket`. @@ -772,6 +783,13 @@ impl AsRawSocket for TcpSocket { } } +#[cfg(all(windows, not(tokio_no_as_fd)))] +impl AsSocket for TcpSocket { + fn as_socket(&self) -> BorrowedSocket<'_> { + unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) } + } +} + #[cfg(windows)] impl FromRawSocket for TcpSocket { /// Converts a `RawSocket` to a `TcpStream`. diff --git a/tokio/src/net/tcp/stream.rs b/tokio/src/net/tcp/stream.rs index b17d33feaea..ae5fd72d542 100644 --- a/tokio/src/net/tcp/stream.rs +++ b/tokio/src/net/tcp/stream.rs @@ -1342,6 +1342,13 @@ mod sys { self.io.as_raw_fd() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for TcpStream { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } } #[cfg(windows)] @@ -1354,6 +1361,13 @@ mod sys { self.io.as_raw_socket() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsSocket for TcpStream { + fn as_socket(&self) -> BorrowedSocket<'_> { + unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) } + } + } } #[cfg(all(tokio_unstable, tokio_wasi))] @@ -1366,4 +1380,11 @@ mod sys { self.io.as_raw_fd() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for TcpStream { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } } diff --git a/tokio/src/net/udp.rs b/tokio/src/net/udp.rs index 213d9149dad..b3d23e3d5a6 100644 --- a/tokio/src/net/udp.rs +++ b/tokio/src/net/udp.rs @@ -1691,7 +1691,7 @@ impl fmt::Debug for UdpSocket { } } -#[cfg(all(unix))] +#[cfg(unix)] mod sys { use super::UdpSocket; use std::os::unix::prelude::*; @@ -1701,6 +1701,13 @@ mod sys { self.io.as_raw_fd() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for UdpSocket { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } } #[cfg(windows)] @@ -1713,4 +1720,11 @@ mod sys { self.io.as_raw_socket() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsSocket for UdpSocket { + fn as_socket(&self) -> BorrowedSocket<'_> { + unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) } + } + } } diff --git a/tokio/src/net/unix/datagram/socket.rs b/tokio/src/net/unix/datagram/socket.rs index 76c6b191283..17a89860e16 100644 --- a/tokio/src/net/unix/datagram/socket.rs +++ b/tokio/src/net/unix/datagram/socket.rs @@ -5,6 +5,8 @@ use std::convert::TryFrom; use std::fmt; use std::io; use std::net::Shutdown; +#[cfg(not(tokio_no_as_fd))] +use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::os::unix::net; use std::path::Path; @@ -1436,3 +1438,10 @@ impl AsRawFd for UnixDatagram { self.io.as_raw_fd() } } + +#[cfg(not(tokio_no_as_fd))] +impl AsFd for UnixDatagram { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} diff --git a/tokio/src/net/unix/listener.rs b/tokio/src/net/unix/listener.rs index 9887f7343be..1eb8f1044f6 100644 --- a/tokio/src/net/unix/listener.rs +++ b/tokio/src/net/unix/listener.rs @@ -4,6 +4,8 @@ use crate::net::unix::{SocketAddr, UnixStream}; use std::convert::TryFrom; use std::fmt; use std::io; +#[cfg(not(tokio_no_as_fd))] +use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::os::unix::net; use std::path::Path; @@ -208,3 +210,10 @@ impl AsRawFd for UnixListener { self.io.as_raw_fd() } } + +#[cfg(not(tokio_no_as_fd))] +impl AsFd for UnixListener { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} diff --git a/tokio/src/net/unix/pipe.rs b/tokio/src/net/unix/pipe.rs index 0775717b0c6..f556dc53565 100644 --- a/tokio/src/net/unix/pipe.rs +++ b/tokio/src/net/unix/pipe.rs @@ -6,6 +6,8 @@ use crate::io::{AsyncRead, AsyncWrite, PollEvented, ReadBuf, Ready}; use mio::unix::pipe as mio_pipe; use std::fs::File; use std::io::{self, Read, Write}; +#[cfg(not(tokio_no_as_fd))] +use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::fs::{FileTypeExt, OpenOptionsExt}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::path::Path; @@ -662,6 +664,13 @@ impl AsRawFd for Sender { } } +#[cfg(not(tokio_no_as_fd))] +impl AsFd for Sender { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} + /// Reading end of a Unix pipe. /// /// It can be constructed from a FIFO file with [`OpenOptions::open_receiver`]. @@ -1161,6 +1170,13 @@ impl AsRawFd for Receiver { } } +#[cfg(not(tokio_no_as_fd))] +impl AsFd for Receiver { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} + /// Checks if file is a FIFO fn is_fifo(file: &File) -> io::Result { Ok(file.metadata()?.file_type().is_fifo()) diff --git a/tokio/src/net/unix/stream.rs b/tokio/src/net/unix/stream.rs index c249bf4b269..15c4f92a98e 100644 --- a/tokio/src/net/unix/stream.rs +++ b/tokio/src/net/unix/stream.rs @@ -9,6 +9,8 @@ use std::convert::TryFrom; use std::fmt; use std::io::{self, Read, Write}; use std::net::Shutdown; +#[cfg(not(tokio_no_as_fd))] +use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::os::unix::net; use std::path::Path; @@ -1000,3 +1002,10 @@ impl AsRawFd for UnixStream { self.io.as_raw_fd() } } + +#[cfg(not(tokio_no_as_fd))] +impl AsFd for UnixStream { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} diff --git a/tokio/src/process/mod.rs b/tokio/src/process/mod.rs index feada06f6d3..cb3a9428593 100644 --- a/tokio/src/process/mod.rs +++ b/tokio/src/process/mod.rs @@ -1428,6 +1428,8 @@ impl TryInto for ChildStderr { #[cfg(unix)] mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, RawFd}; use super::{ChildStderr, ChildStdin, ChildStdout}; @@ -1438,21 +1440,44 @@ mod sys { } } + #[cfg(not(tokio_no_as_fd))] + impl AsFd for ChildStdin { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } + impl AsRawFd for ChildStdout { fn as_raw_fd(&self) -> RawFd { self.inner.as_raw_fd() } } + #[cfg(not(tokio_no_as_fd))] + impl AsFd for ChildStdout { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } + impl AsRawFd for ChildStderr { fn as_raw_fd(&self) -> RawFd { self.inner.as_raw_fd() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsFd for ChildStderr { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } + } } #[cfg(windows)] mod sys { + #[cfg(not(tokio_no_as_fd))] + use std::os::windows::io::{AsHandle, BorrowedHandle}; use std::os::windows::io::{AsRawHandle, RawHandle}; use super::{ChildStderr, ChildStdin, ChildStdout}; @@ -1463,17 +1488,38 @@ mod sys { } } + #[cfg(not(tokio_no_as_fd))] + impl AsHandle for ChildStdin { + fn as_fd(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } + } + } + impl AsRawHandle for ChildStdout { fn as_raw_handle(&self) -> RawHandle { self.inner.as_raw_handle() } } + #[cfg(not(tokio_no_as_fd))] + impl AsHandle for ChildStdout { + fn as_fd(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } + } + } + impl AsRawHandle for ChildStderr { fn as_raw_handle(&self) -> RawHandle { self.inner.as_raw_handle() } } + + #[cfg(not(tokio_no_as_fd))] + impl AsHandle for ChildStderr { + fn as_fd(&self) -> BorrowedHandle<'_> { + unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } + } + } } #[cfg(all(test, not(loom)))] diff --git a/tokio/src/process/unix/mod.rs b/tokio/src/process/unix/mod.rs index 78c792cc765..cd6962b85c6 100644 --- a/tokio/src/process/unix/mod.rs +++ b/tokio/src/process/unix/mod.rs @@ -39,6 +39,8 @@ use std::fmt; use std::fs::File; use std::future::Future; use std::io; +#[cfg(not(tokio_no_as_fd))] +use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::pin::Pin; use std::process::{Child as StdChild, ExitStatus, Stdio}; @@ -194,6 +196,13 @@ impl AsRawFd for Pipe { } } +#[cfg(not(tokio_no_as_fd))] +impl AsFd for Pipe { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} + pub(crate) fn convert_to_stdio(io: ChildStdio) -> io::Result { let mut fd = io.inner.into_inner()?.fd; @@ -246,6 +255,13 @@ impl AsRawFd for ChildStdio { } } +#[cfg(not(tokio_no_as_fd))] +impl AsFd for ChildStdio { + fn as_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) } + } +} + impl AsyncWrite for ChildStdio { fn poll_write( self: Pin<&mut Self>, From a078f386bc1a401b32a4426f5c9750c2594ce1e8 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Mon, 27 Feb 2023 19:01:44 -0500 Subject: [PATCH 2/4] fix build --- tokio/src/fs/file.rs | 10 ++++++---- tokio/src/net/tcp/listener.rs | 2 +- tokio/src/net/tcp/socket.rs | 2 +- tokio/src/net/unix/datagram/socket.rs | 2 +- tokio/src/net/unix/listener.rs | 2 +- tokio/src/net/unix/pipe.rs | 4 ++-- tokio/src/net/unix/stream.rs | 2 +- tokio/src/process/mod.rs | 8 ++++---- tokio/src/process/unix/mod.rs | 2 +- 9 files changed, 18 insertions(+), 16 deletions(-) diff --git a/tokio/src/fs/file.rs b/tokio/src/fs/file.rs index 96a0a38b252..bd8c9c27165 100644 --- a/tokio/src/fs/file.rs +++ b/tokio/src/fs/file.rs @@ -726,9 +726,11 @@ impl std::os::unix::io::AsRawFd for File { } #[cfg(all(unix, not(tokio_no_as_fd)))] -impl std::os::fd::AsFd for File { - fn as_fd(&self) -> std::os::fd::BorrowedFd<'_> { - unsafe { std::os::fd::BorrowedFd::borrow_raw(std::os::unix::io::AsRawFd::as_raw_fd(self)) } +impl std::os::unix::io::AsFd for File { + fn as_fd(&self) -> std::os::unix::io::BorrowedFd<'_> { + unsafe { + std::os::unix::io::BorrowedFd::borrow_raw(std::os::unix::io::AsRawFd::as_raw_fd(self)) + } } } @@ -747,7 +749,7 @@ impl std::os::windows::io::AsRawHandle for File { } #[cfg(all(windows, not(tokio_no_as_fd)))] -impl std::os::windows::io::AsHandle { +impl std::os::windows::io::AsHandle for File { fn as_handle(&self) -> std::os::windows::io::BorrowedHandle<'_> { unsafe { std::os::windows::io::BorrowedHandle::borrow_raw( diff --git a/tokio/src/net/tcp/listener.rs b/tokio/src/net/tcp/listener.rs index acde211968b..825e960e6d9 100644 --- a/tokio/src/net/tcp/listener.rs +++ b/tokio/src/net/tcp/listener.rs @@ -449,7 +449,7 @@ mod sys { } #[cfg(not(tokio_no_as_fd))] - impl AsSocket for UdpSocket { + impl AsSocket for TcpListener { fn as_socket(&self) -> BorrowedSocket<'_> { unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) } } diff --git a/tokio/src/net/tcp/socket.rs b/tokio/src/net/tcp/socket.rs index 93f5585dcf8..9c76e040857 100644 --- a/tokio/src/net/tcp/socket.rs +++ b/tokio/src/net/tcp/socket.rs @@ -5,7 +5,7 @@ use std::io; use std::net::SocketAddr; #[cfg(all(unix, not(tokio_no_as_fd)))] -use std::os::fd::{AsFd, BorrowedFd}; +use std::os::unix::io::{AsFd, BorrowedFd}; #[cfg(unix)] use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; #[cfg(windows)] diff --git a/tokio/src/net/unix/datagram/socket.rs b/tokio/src/net/unix/datagram/socket.rs index 17a89860e16..371a10f9ccd 100644 --- a/tokio/src/net/unix/datagram/socket.rs +++ b/tokio/src/net/unix/datagram/socket.rs @@ -6,7 +6,7 @@ use std::fmt; use std::io; use std::net::Shutdown; #[cfg(not(tokio_no_as_fd))] -use std::os::fd::{AsFd, BorrowedFd}; +use std::os::unix::io::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::os::unix::net; use std::path::Path; diff --git a/tokio/src/net/unix/listener.rs b/tokio/src/net/unix/listener.rs index 1eb8f1044f6..1a2614feff4 100644 --- a/tokio/src/net/unix/listener.rs +++ b/tokio/src/net/unix/listener.rs @@ -5,7 +5,7 @@ use std::convert::TryFrom; use std::fmt; use std::io; #[cfg(not(tokio_no_as_fd))] -use std::os::fd::{AsFd, BorrowedFd}; +use std::os::unix::io::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::os::unix::net; use std::path::Path; diff --git a/tokio/src/net/unix/pipe.rs b/tokio/src/net/unix/pipe.rs index f556dc53565..188ac68b11c 100644 --- a/tokio/src/net/unix/pipe.rs +++ b/tokio/src/net/unix/pipe.rs @@ -6,9 +6,9 @@ use crate::io::{AsyncRead, AsyncWrite, PollEvented, ReadBuf, Ready}; use mio::unix::pipe as mio_pipe; use std::fs::File; use std::io::{self, Read, Write}; -#[cfg(not(tokio_no_as_fd))] -use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::fs::{FileTypeExt, OpenOptionsExt}; +#[cfg(not(tokio_no_as_fd))] +use std::os::unix::io::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::path::Path; use std::pin::Pin; diff --git a/tokio/src/net/unix/stream.rs b/tokio/src/net/unix/stream.rs index 15c4f92a98e..80df2496532 100644 --- a/tokio/src/net/unix/stream.rs +++ b/tokio/src/net/unix/stream.rs @@ -10,7 +10,7 @@ use std::fmt; use std::io::{self, Read, Write}; use std::net::Shutdown; #[cfg(not(tokio_no_as_fd))] -use std::os::fd::{AsFd, BorrowedFd}; +use std::os::unix::io::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::os::unix::net; use std::path::Path; diff --git a/tokio/src/process/mod.rs b/tokio/src/process/mod.rs index cb3a9428593..52ff73b51a2 100644 --- a/tokio/src/process/mod.rs +++ b/tokio/src/process/mod.rs @@ -1429,7 +1429,7 @@ impl TryInto for ChildStderr { #[cfg(unix)] mod sys { #[cfg(not(tokio_no_as_fd))] - use std::os::fd::{AsFd, BorrowedFd}; + use std::os::unix::io::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, RawFd}; use super::{ChildStderr, ChildStdin, ChildStdout}; @@ -1490,7 +1490,7 @@ mod sys { #[cfg(not(tokio_no_as_fd))] impl AsHandle for ChildStdin { - fn as_fd(&self) -> BorrowedHandle<'_> { + fn as_handle(&self) -> BorrowedHandle<'_> { unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } } } @@ -1503,7 +1503,7 @@ mod sys { #[cfg(not(tokio_no_as_fd))] impl AsHandle for ChildStdout { - fn as_fd(&self) -> BorrowedHandle<'_> { + fn as_handle(&self) -> BorrowedHandle<'_> { unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } } } @@ -1516,7 +1516,7 @@ mod sys { #[cfg(not(tokio_no_as_fd))] impl AsHandle for ChildStderr { - fn as_fd(&self) -> BorrowedHandle<'_> { + fn as_handle(&self) -> BorrowedHandle<'_> { unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } } } diff --git a/tokio/src/process/unix/mod.rs b/tokio/src/process/unix/mod.rs index cd6962b85c6..41857f49c8f 100644 --- a/tokio/src/process/unix/mod.rs +++ b/tokio/src/process/unix/mod.rs @@ -40,7 +40,7 @@ use std::fs::File; use std::future::Future; use std::io; #[cfg(not(tokio_no_as_fd))] -use std::os::fd::{AsFd, BorrowedFd}; +use std::os::unix::io::{AsFd, BorrowedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::pin::Pin; use std::process::{Child as StdChild, ExitStatus, Stdio}; From 6d0c9df50880004ca3e781ba9163bf43e5bea621 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Mon, 27 Feb 2023 19:09:16 -0500 Subject: [PATCH 3/4] fix tests for real --- tokio/src/process/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tokio/src/process/mod.rs b/tokio/src/process/mod.rs index 52ff73b51a2..0aa72c6f2a3 100644 --- a/tokio/src/process/mod.rs +++ b/tokio/src/process/mod.rs @@ -1491,7 +1491,7 @@ mod sys { #[cfg(not(tokio_no_as_fd))] impl AsHandle for ChildStdin { fn as_handle(&self) -> BorrowedHandle<'_> { - unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } } } @@ -1504,7 +1504,7 @@ mod sys { #[cfg(not(tokio_no_as_fd))] impl AsHandle for ChildStdout { fn as_handle(&self) -> BorrowedHandle<'_> { - unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } } } @@ -1517,7 +1517,7 @@ mod sys { #[cfg(not(tokio_no_as_fd))] impl AsHandle for ChildStderr { fn as_handle(&self) -> BorrowedHandle<'_> { - unsafe { BorrowedHandle::borrow_raw(self.as_raw_fd()) } + unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) } } } } From 095fb5e270fc7a7aa54fb4a8bb7512d1a16fe833 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 11 Mar 2023 09:03:42 -0500 Subject: [PATCH 4/4] update probe --- tokio/build.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/tokio/build.rs b/tokio/build.rs index 2444f48e586..0e2480ed846 100644 --- a/tokio/build.rs +++ b/tokio/build.rs @@ -24,6 +24,19 @@ const CONST_MUTEX_NEW_PROBE: &str = r#" } "#; +const AS_FD_PROBE: &str = r#" +{ + #![allow(unused_imports)] + + #[cfg(unix)] + use std::os::unix::prelude::AsFd as _; + #[cfg(windows)] + use std::os::windows::prelude::AsSocket as _; + #[cfg(target = "wasm32-wasi")] + use std::os::wasi::prelude::AsFd as _; +} +"#; + const TARGET_HAS_ATOMIC_PROBE: &str = r#" { #[cfg(target_has_atomic = "ptr")] @@ -107,7 +120,6 @@ fn main() { // The `Mutex::new` method was made const in 1.63. if ac.probe_rustc_version(1, 64) { enable_const_mutex_new = true; - enable_as_fd = true; } else if ac.probe_rustc_version(1, 63) { // This compiler claims to be 1.63, but there are some nightly // compilers that claim to be 1.63 without supporting the @@ -117,6 +129,20 @@ fn main() { // The oldest nightly that supports the feature is 2022-06-20. if ac.probe_expression(CONST_MUTEX_NEW_PROBE) { enable_const_mutex_new = true; + } + } + + // The `AsFd` family of traits were made stable in 1.63. + if ac.probe_rustc_version(1, 64) { + enable_as_fd = true; + } else if ac.probe_rustc_version(1, 63) { + // This compiler claims to be 1.63, but there are some nightly + // compilers that claim to be 1.63 without supporting the + // feature. Explicitly probe to check if code using them + // compiles. + // + // The oldest nightly that supports the feature is 2022-06-16. + if ac.probe_expression(AS_FD_PROBE) { enable_as_fd = true; } }