diff options
| author | The8472 <git@infinite-source.de> | 2020-09-06 22:47:58 +0200 |
|---|---|---|
| committer | The8472 <git@infinite-source.de> | 2020-11-13 19:45:38 +0100 |
| commit | cd3bddc044728e040d6a22c684f1b9f711566772 (patch) | |
| tree | a1ffbebe7d793b0244432ee6fb36bf8395c994a0 /library/std/src | |
| parent | 67a6059aa5dab924a09194d5490d43da518a40a5 (diff) | |
| download | rust-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.rs | 32 |
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), |
