about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorThe8472 <git@infinite-source.de>2020-09-06 22:47:58 +0200
committerThe8472 <git@infinite-source.de>2020-11-13 19:45:38 +0100
commitcd3bddc044728e040d6a22c684f1b9f711566772 (patch)
treea1ffbebe7d793b0244432ee6fb36bf8395c994a0 /library/std/src
parent67a6059aa5dab924a09194d5490d43da518a40a5 (diff)
downloadrust-cd3bddc044728e040d6a22c684f1b9f711566772.tar.gz
rust-cd3bddc044728e040d6a22c684f1b9f711566772.zip
prioritize sendfile over splice since it results in fewer context switches when sending to pipes
splice returns to userspace when the pipe is full, sendfile
just blocks until it's done, this can achieve much higher throughput
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/io/copy.rs32
1 files changed, 16 insertions, 16 deletions
diff --git a/library/std/src/io/copy.rs b/library/std/src/io/copy.rs
index 4604f2ab002..f54a9b8b764 100644
--- a/library/std/src/io/copy.rs
+++ b/library/std/src/io/copy.rs
@@ -173,22 +173,6 @@ mod kernel_copy {
                     )
                     .map(|bytes_copied| bytes_copied + bytes_flushed)
                 }
-                (CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
-                    if reader_meta.is_fifo() || writer_meta.is_fifo() =>
-                {
-                    // splice
-                    let bytes_flushed = flush()?;
-                    let max_write = reader.min_limit();
-                    let (mut reader, mut writer) =
-                        unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
-                    crate::sys::fs::sendfile_splice(
-                        crate::sys::fs::SpliceMode::Splice,
-                        &mut reader,
-                        &mut writer,
-                        max_write,
-                    )
-                    .map(|bytes_sent| bytes_sent + bytes_flushed)
-                }
                 (
                     CopyParams(FdMeta::Metadata(reader_meta), Some(readfd)),
                     CopyParams(_, Some(writefd)),
@@ -206,6 +190,22 @@ mod kernel_copy {
                         &mut writer,
                         min(len, max_write),
                     )
+                        .map(|bytes_sent| bytes_sent + bytes_flushed)
+                }
+                (CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
+                    if reader_meta.is_fifo() || writer_meta.is_fifo() =>
+                {
+                    // splice
+                    let bytes_flushed = flush()?;
+                    let max_write = reader.min_limit();
+                    let (mut reader, mut writer) =
+                        unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
+                    crate::sys::fs::sendfile_splice(
+                        crate::sys::fs::SpliceMode::Splice,
+                        &mut reader,
+                        &mut writer,
+                        max_write,
+                    )
                     .map(|bytes_sent| bytes_sent + bytes_flushed)
                 }
                 _ => super::generic_copy(reader, writer),