diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-10-22 08:41:05 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-10-24 14:22:35 -0700 |
| commit | 816e46dd633cf4cc5741dde6ce3bffd4a9ba67a7 (patch) | |
| tree | 91be9afd56dcda81b3ed6f09e43f9fa4d12290cc /src/libstd/rt | |
| parent | 262b958a4bedf419335069c95f054a22da48a88a (diff) | |
| download | rust-816e46dd633cf4cc5741dde6ce3bffd4a9ba67a7.tar.gz rust-816e46dd633cf4cc5741dde6ce3bffd4a9ba67a7.zip | |
Fixing some tests, adding some pipes
This adds constructors to pipe streams in the new runtime to take ownership of file descriptors, and also fixes a few tests relating to the std::run changes (new errors are raised on io_error and one test is xfail'd).
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/io/pipe.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/libstd/rt/io/pipe.rs b/src/libstd/rt/io/pipe.rs index 979a1dfc65e..ec9a4a0101f 100644 --- a/src/libstd/rt/io/pipe.rs +++ b/src/libstd/rt/io/pipe.rs @@ -16,13 +16,45 @@ use prelude::*; use super::{Reader, Writer}; use rt::io::{io_error, EndOfFile}; -use rt::rtio::RtioPipe; +use rt::io::native::file; +use rt::rtio::{RtioPipe, with_local_io}; pub struct PipeStream { priv obj: ~RtioPipe, } impl PipeStream { + /// Consumes a file descriptor to return a pipe stream that will have + /// synchronous, but non-blocking reads/writes. This is useful if the file + /// descriptor is acquired via means other than the standard methods. + /// + /// This operation consumes ownership of the file descriptor and it will be + /// closed once the object is deallocated. + /// + /// # Example + /// + /// use std::libc; + /// use std::rt::io::pipe; + /// + /// let mut pipe = PipeStream::open(libc::STDERR_FILENO); + /// pipe.write(bytes!("Hello, stderr!")); + /// + /// # Failure + /// + /// If the pipe cannot be created, an error will be raised on the + /// `io_error` condition. + pub fn open(fd: file::fd_t) -> Option<PipeStream> { + do with_local_io |io| { + match io.pipe_open(fd) { + Ok(obj) => Some(PipeStream { obj: obj }), + Err(e) => { + io_error::cond.raise(e); + None + } + } + } + } + pub fn new(inner: ~RtioPipe) -> PipeStream { PipeStream { obj: inner } } |
