Leverage kernel copy for UnixStream

UDS can be a sendfile destination, just like TCP sockets.
This commit is contained in:
Nicolas Koch 2020-12-01 14:45:36 +01:00
parent eda4c63fdc
commit 59874516fa

View File

@ -56,6 +56,7 @@ use crate::mem::ManuallyDrop;
use crate::net::TcpStream; use crate::net::TcpStream;
use crate::os::unix::fs::FileTypeExt; use crate::os::unix::fs::FileTypeExt;
use crate::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use crate::os::unix::io::{AsRawFd, FromRawFd, RawFd};
use crate::os::unix::net::UnixStream;
use crate::process::{ChildStderr, ChildStdin, ChildStdout}; use crate::process::{ChildStderr, ChildStdin, ChildStdout};
use crate::ptr; use crate::ptr;
use crate::sync::atomic::{AtomicBool, Ordering}; use crate::sync::atomic::{AtomicBool, Ordering};
@ -320,6 +321,34 @@ impl CopyWrite for &TcpStream {
} }
} }
impl CopyRead for UnixStream {
fn properties(&self) -> CopyParams {
// avoid the stat syscall since we can be fairly sure it's a socket
CopyParams(FdMeta::Socket, Some(self.as_raw_fd()))
}
}
impl CopyRead for &UnixStream {
fn properties(&self) -> CopyParams {
// avoid the stat syscall since we can be fairly sure it's a socket
CopyParams(FdMeta::Socket, Some(self.as_raw_fd()))
}
}
impl CopyWrite for UnixStream {
fn properties(&self) -> CopyParams {
// avoid the stat syscall since we can be fairly sure it's a socket
CopyParams(FdMeta::Socket, Some(self.as_raw_fd()))
}
}
impl CopyWrite for &UnixStream {
fn properties(&self) -> CopyParams {
// avoid the stat syscall since we can be fairly sure it's a socket
CopyParams(FdMeta::Socket, Some(self.as_raw_fd()))
}
}
impl CopyWrite for ChildStdin { impl CopyWrite for ChildStdin {
fn properties(&self) -> CopyParams { fn properties(&self) -> CopyParams {
CopyParams(FdMeta::Pipe, Some(self.as_raw_fd())) CopyParams(FdMeta::Pipe, Some(self.as_raw_fd()))