diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2016-02-12 00:17:24 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2016-03-08 17:45:44 -0800 |
| commit | d46c99abe8671479c48b003bf06e98eda7eb85ab (patch) | |
| tree | 9cd992343e114fea26c3be8383a2d304e06e4a56 /src/libstd/sys/unix/fd.rs | |
| parent | eabfc160f87ccc0b296f49af7fe688506580c473 (diff) | |
| download | rust-d46c99abe8671479c48b003bf06e98eda7eb85ab.tar.gz rust-d46c99abe8671479c48b003bf06e98eda7eb85ab.zip | |
std: Funnel read_to_end through to one location
This pushes the implementation detail of proxying `read_to_end` through to `read_to_end_uninitialized` all the way down to the `FileDesc` and `Handle` implementations on Unix/Windows. This way intermediate layers will also be able to take advantage of this optimized implementation. This commit also adds the optimized implementation for `ChildStdout` and `ChildStderr`.
Diffstat (limited to 'src/libstd/sys/unix/fd.rs')
| -rw-r--r-- | src/libstd/sys/unix/fd.rs | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/libstd/sys/unix/fd.rs b/src/libstd/sys/unix/fd.rs index 299c6ec2731..a00e6c3eb72 100644 --- a/src/libstd/sys/unix/fd.rs +++ b/src/libstd/sys/unix/fd.rs @@ -8,12 +8,15 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use io; +use prelude::v1::*; + +use io::{self, Read}; use libc::{self, c_int, size_t, c_void}; use mem; +use sync::atomic::{AtomicBool, Ordering}; use sys::cvt; use sys_common::AsInner; -use sync::atomic::{AtomicBool, Ordering}; +use sys_common::io::read_to_end_uninitialized; pub struct FileDesc { fd: c_int, @@ -42,6 +45,11 @@ impl FileDesc { Ok(ret as usize) } + pub fn read_to_end(&self, buf: &mut Vec<u8>) -> io::Result<usize> { + let mut me = self; + (&mut me).read_to_end(buf) + } + pub fn write(&self, buf: &[u8]) -> io::Result<usize> { let ret = try!(cvt(unsafe { libc::write(self.fd, @@ -118,6 +126,17 @@ impl FileDesc { } } +#[unstable(reason = "not public", issue = "0", feature = "fd_read")] +impl<'a> Read for &'a FileDesc { + fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { + (**self).read(buf) + } + + fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> { + unsafe { read_to_end_uninitialized(self, buf) } + } +} + impl AsInner<c_int> for FileDesc { fn as_inner(&self) -> &c_int { &self.fd } } |
