Skip to content

Commit a52fce7

Browse files
authored
Rollup merge of rust-lang#59852 - alexcrichton:more-vectored, r=sfackler
std: Add `{read,write}_vectored` for more types This commit implements the `{read,write}_vectored` methods on more types in the standard library, namely: * `std::fs::File` * `std::process::ChildStd{in,out,err}` * `std::io::Std{in,out,err}` * `std::io::Std{in,out,err}Lock` * `std::io::Std{in,out,err}Raw` Where supported the OS implementations hook up to native support, otherwise it falls back to the already-defaulted implementation.
2 parents 449697b + acf3ddb commit a52fce7

File tree

19 files changed

+247
-37
lines changed

19 files changed

+247
-37
lines changed

src/libstd/fs.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
use crate::fmt;
1111
use crate::ffi::OsString;
12-
use crate::io::{self, SeekFrom, Seek, Read, Initializer, Write};
12+
use crate::io::{self, SeekFrom, Seek, Read, Initializer, Write, IoVec, IoVecMut};
1313
use crate::path::{Path, PathBuf};
1414
use crate::sys::fs as fs_imp;
1515
use crate::sys_common::{AsInnerMut, FromInner, AsInner, IntoInner};
@@ -615,6 +615,10 @@ impl Read for File {
615615
self.inner.read(buf)
616616
}
617617

618+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
619+
self.inner.read_vectored(bufs)
620+
}
621+
618622
#[inline]
619623
unsafe fn initializer(&self) -> Initializer {
620624
Initializer::nop()
@@ -625,6 +629,11 @@ impl Write for File {
625629
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
626630
self.inner.write(buf)
627631
}
632+
633+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
634+
self.inner.write_vectored(bufs)
635+
}
636+
628637
fn flush(&mut self) -> io::Result<()> { self.inner.flush() }
629638
}
630639
#[stable(feature = "rust1", since = "1.0.0")]
@@ -639,6 +648,10 @@ impl Read for &File {
639648
self.inner.read(buf)
640649
}
641650

651+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
652+
self.inner.read_vectored(bufs)
653+
}
654+
642655
#[inline]
643656
unsafe fn initializer(&self) -> Initializer {
644657
Initializer::nop()
@@ -649,6 +662,11 @@ impl Write for &File {
649662
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
650663
self.inner.write(buf)
651664
}
665+
666+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
667+
self.inner.write_vectored(bufs)
668+
}
669+
652670
fn flush(&mut self) -> io::Result<()> { self.inner.flush() }
653671
}
654672
#[stable(feature = "rust1", since = "1.0.0")]

src/libstd/io/stdio.rs

+50-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::io::prelude::*;
55
use crate::cell::RefCell;
66
use crate::fmt;
77
use crate::io::lazy::Lazy;
8-
use crate::io::{self, Initializer, BufReader, LineWriter};
8+
use crate::io::{self, Initializer, BufReader, LineWriter, IoVec, IoVecMut};
99
use crate::sync::{Arc, Mutex, MutexGuard};
1010
use crate::sys::stdio;
1111
use crate::sys_common::remutex::{ReentrantMutex, ReentrantMutexGuard};
@@ -75,17 +75,31 @@ fn stderr_raw() -> io::Result<StderrRaw> { stdio::Stderr::new().map(StderrRaw) }
7575
impl Read for StdinRaw {
7676
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
7777

78+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
79+
self.0.read_vectored(bufs)
80+
}
81+
7882
#[inline]
7983
unsafe fn initializer(&self) -> Initializer {
8084
Initializer::nop()
8185
}
8286
}
8387
impl Write for StdoutRaw {
8488
fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) }
89+
90+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
91+
self.0.write_vectored(bufs)
92+
}
93+
8594
fn flush(&mut self) -> io::Result<()> { self.0.flush() }
8695
}
8796
impl Write for StderrRaw {
8897
fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) }
98+
99+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
100+
self.0.write_vectored(bufs)
101+
}
102+
89103
fn flush(&mut self) -> io::Result<()> { self.0.flush() }
90104
}
91105

@@ -102,6 +116,14 @@ impl<W: io::Write> io::Write for Maybe<W> {
102116
}
103117
}
104118

119+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
120+
let total = bufs.iter().map(|b| b.len()).sum();
121+
match self {
122+
Maybe::Real(w) => handle_ebadf(w.write_vectored(bufs), total),
123+
Maybe::Fake => Ok(total),
124+
}
125+
}
126+
105127
fn flush(&mut self) -> io::Result<()> {
106128
match *self {
107129
Maybe::Real(ref mut w) => handle_ebadf(w.flush(), ()),
@@ -117,6 +139,13 @@ impl<R: io::Read> io::Read for Maybe<R> {
117139
Maybe::Fake => Ok(0)
118140
}
119141
}
142+
143+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
144+
match self {
145+
Maybe::Real(r) => handle_ebadf(r.read_vectored(bufs), 0),
146+
Maybe::Fake => Ok(0)
147+
}
148+
}
120149
}
121150

122151
fn handle_ebadf<T>(r: io::Result<T>, default: T) -> io::Result<T> {
@@ -305,6 +334,9 @@ impl Read for Stdin {
305334
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
306335
self.lock().read(buf)
307336
}
337+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
338+
self.lock().read_vectored(bufs)
339+
}
308340
#[inline]
309341
unsafe fn initializer(&self) -> Initializer {
310342
Initializer::nop()
@@ -325,6 +357,11 @@ impl Read for StdinLock<'_> {
325357
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
326358
self.inner.read(buf)
327359
}
360+
361+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
362+
self.inner.read_vectored(bufs)
363+
}
364+
328365
#[inline]
329366
unsafe fn initializer(&self) -> Initializer {
330367
Initializer::nop()
@@ -483,6 +520,9 @@ impl Write for Stdout {
483520
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
484521
self.lock().write(buf)
485522
}
523+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
524+
self.lock().write_vectored(bufs)
525+
}
486526
fn flush(&mut self) -> io::Result<()> {
487527
self.lock().flush()
488528
}
@@ -498,6 +538,9 @@ impl Write for StdoutLock<'_> {
498538
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
499539
self.inner.borrow_mut().write(buf)
500540
}
541+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
542+
self.inner.borrow_mut().write_vectored(bufs)
543+
}
501544
fn flush(&mut self) -> io::Result<()> {
502545
self.inner.borrow_mut().flush()
503546
}
@@ -636,6 +679,9 @@ impl Write for Stderr {
636679
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
637680
self.lock().write(buf)
638681
}
682+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
683+
self.lock().write_vectored(bufs)
684+
}
639685
fn flush(&mut self) -> io::Result<()> {
640686
self.lock().flush()
641687
}
@@ -651,6 +697,9 @@ impl Write for StderrLock<'_> {
651697
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
652698
self.inner.borrow_mut().write(buf)
653699
}
700+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
701+
self.inner.borrow_mut().write_vectored(bufs)
702+
}
654703
fn flush(&mut self) -> io::Result<()> {
655704
self.inner.borrow_mut().flush()
656705
}

src/libstd/process.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ use crate::io::prelude::*;
111111
use crate::ffi::OsStr;
112112
use crate::fmt;
113113
use crate::fs;
114-
use crate::io::{self, Initializer};
114+
use crate::io::{self, Initializer, IoVec, IoVecMut};
115115
use crate::path::Path;
116116
use crate::str;
117117
use crate::sys::pipe::{read2, AnonPipe};
@@ -225,6 +225,10 @@ impl Write for ChildStdin {
225225
self.inner.write(buf)
226226
}
227227

228+
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
229+
self.inner.write_vectored(bufs)
230+
}
231+
228232
fn flush(&mut self) -> io::Result<()> {
229233
Ok(())
230234
}
@@ -271,6 +275,11 @@ impl Read for ChildStdout {
271275
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
272276
self.inner.read(buf)
273277
}
278+
279+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
280+
self.inner.read_vectored(bufs)
281+
}
282+
274283
#[inline]
275284
unsafe fn initializer(&self) -> Initializer {
276285
Initializer::nop()
@@ -318,6 +327,11 @@ impl Read for ChildStderr {
318327
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
319328
self.inner.read(buf)
320329
}
330+
331+
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
332+
self.inner.read_vectored(bufs)
333+
}
334+
321335
#[inline]
322336
unsafe fn initializer(&self) -> Initializer {
323337
Initializer::nop()

src/libstd/sys/cloudabi/shims/fs.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::ffi::OsString;
22
use crate::fmt;
33
use crate::hash::{Hash, Hasher};
4-
use crate::io::{self, SeekFrom};
4+
use crate::io::{self, SeekFrom, IoVec, IoVecMut};
55
use crate::path::{Path, PathBuf};
66
use crate::sys::time::SystemTime;
77
use crate::sys::{unsupported, Void};
@@ -198,10 +198,18 @@ impl File {
198198
match self.0 {}
199199
}
200200

201+
pub fn read_vectored(&self, _bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
202+
match self.0 {}
203+
}
204+
201205
pub fn write(&self, _buf: &[u8]) -> io::Result<usize> {
202206
match self.0 {}
203207
}
204208

209+
pub fn write_vectored(&self, _bufs: &[IoVec<'_>]) -> io::Result<usize> {
210+
match self.0 {}
211+
}
212+
205213
pub fn flush(&self) -> io::Result<()> {
206214
match self.0 {}
207215
}

src/libstd/sys/cloudabi/shims/pipe.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::io;
1+
use crate::io::{self, IoVec, IoVecMut};
22
use crate::sys::Void;
33

44
pub struct AnonPipe(Void);
@@ -8,10 +8,18 @@ impl AnonPipe {
88
match self.0 {}
99
}
1010

11+
pub fn read_vectored(&self, _bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
12+
match self.0 {}
13+
}
14+
1115
pub fn write(&self, _buf: &[u8]) -> io::Result<usize> {
1216
match self.0 {}
1317
}
1418

19+
pub fn write_vectored(&self, _bufs: &[IoVec<'_>]) -> io::Result<usize> {
20+
match self.0 {}
21+
}
22+
1523
pub fn diverge(&self) -> ! {
1624
match self.0 {}
1725
}

src/libstd/sys/redox/fs.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::os::unix::prelude::*;
22

33
use crate::ffi::{OsString, OsStr};
44
use crate::fmt;
5-
use crate::io::{self, Error, SeekFrom};
5+
use crate::io::{self, Error, SeekFrom, IoVec, IoVecMut};
66
use crate::path::{Path, PathBuf};
77
use crate::sync::Arc;
88
use crate::sys::fd::FileDesc;
@@ -278,10 +278,18 @@ impl File {
278278
self.0.read(buf)
279279
}
280280

281+
pub fn read_vectored(&self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
282+
crate::io::default_read_vectored(|buf| self.read(buf), bufs)
283+
}
284+
281285
pub fn write(&self, buf: &[u8]) -> io::Result<usize> {
282286
self.0.write(buf)
283287
}
284288

289+
pub fn write_vectored(&self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
290+
crate::io::default_write_vectored(|buf| self.write(buf), bufs)
291+
}
292+
285293
pub fn flush(&self) -> io::Result<()> { Ok(()) }
286294

287295
pub fn seek(&self, pos: SeekFrom) -> io::Result<u64> {

src/libstd/sys/redox/pipe.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::io;
1+
use crate::io::{self, IoVec, IoVecMut};
22
use crate::sys::{cvt, syscall};
33
use crate::sys::fd::FileDesc;
44

@@ -24,10 +24,18 @@ impl AnonPipe {
2424
self.0.read(buf)
2525
}
2626

27+
pub fn read_vectored(&self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
28+
crate::io::default_read_vectored(|buf| self.read(buf), bufs)
29+
}
30+
2731
pub fn write(&self, buf: &[u8]) -> io::Result<usize> {
2832
self.0.write(buf)
2933
}
3034

35+
pub fn write_vectored(&self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
36+
crate::io::default_write_vectored(|buf| self.write(buf), bufs)
37+
}
38+
3139
pub fn fd(&self) -> &FileDesc { &self.0 }
3240
pub fn into_fd(self) -> FileDesc { self.0 }
3341
}

src/libstd/sys/sgx/fs.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::ffi::OsString;
22
use crate::fmt;
33
use crate::hash::{Hash, Hasher};
4-
use crate::io::{self, SeekFrom};
4+
use crate::io::{self, SeekFrom, IoVec, IoVecMut};
55
use crate::path::{Path, PathBuf};
66
use crate::sys::time::SystemTime;
77
use crate::sys::{unsupported, Void};
@@ -200,10 +200,18 @@ impl File {
200200
match self.0 {}
201201
}
202202

203+
pub fn read_vectored(&self, _bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
204+
match self.0 {}
205+
}
206+
203207
pub fn write(&self, _buf: &[u8]) -> io::Result<usize> {
204208
match self.0 {}
205209
}
206210

211+
pub fn write_vectored(&self, _bufs: &[IoVec<'_>]) -> io::Result<usize> {
212+
match self.0 {}
213+
}
214+
207215
pub fn flush(&self) -> io::Result<()> {
208216
match self.0 {}
209217
}

src/libstd/sys/sgx/pipe.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::io;
1+
use crate::io::{self, IoVec, IoVecMut};
22
use crate::sys::Void;
33

44
pub struct AnonPipe(Void);
@@ -8,18 +8,23 @@ impl AnonPipe {
88
match self.0 {}
99
}
1010

11+
pub fn read_vectored(&self, _bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
12+
match self.0 {}
13+
}
14+
1115
pub fn write(&self, _buf: &[u8]) -> io::Result<usize> {
1216
match self.0 {}
1317
}
1418

19+
pub fn write_vectored(&self, _bufs: &[IoVec<'_>]) -> io::Result<usize> {
20+
match self.0 {}
21+
}
22+
1523
pub fn diverge(&self) -> ! {
1624
match self.0 {}
1725
}
1826
}
1927

20-
pub fn read2(p1: AnonPipe,
21-
_v1: &mut Vec<u8>,
22-
_p2: AnonPipe,
23-
_v2: &mut Vec<u8>) -> io::Result<()> {
28+
pub fn read2(p1: AnonPipe, _v1: &mut Vec<u8>, _p2: AnonPipe, _v2: &mut Vec<u8>) -> io::Result<()> {
2429
match p1.0 {}
2530
}

0 commit comments

Comments
 (0)