From b89e1c000e133fb5db3ea5afd0948db6dc088977 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 15 Aug 2013 14:18:13 -0700 Subject: Implement process bindings to libuv Closes #6436 --- src/libstd/rt/io/file.rs | 3 -- src/libstd/rt/io/mod.rs | 3 ++ src/libstd/rt/io/net/tcp.rs | 6 ++-- src/libstd/rt/io/pipe.rs | 77 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 src/libstd/rt/io/pipe.rs (limited to 'src/libstd/rt/io') diff --git a/src/libstd/rt/io/file.rs b/src/libstd/rt/io/file.rs index f4e9c4d7c11..534e308a1a6 100644 --- a/src/libstd/rt/io/file.rs +++ b/src/libstd/rt/io/file.rs @@ -71,9 +71,6 @@ pub struct FileStream { last_nread: int, } -impl FileStream { -} - impl Reader for FileStream { fn read(&mut self, buf: &mut [u8]) -> Option { match self.fd.read(buf) { diff --git a/src/libstd/rt/io/mod.rs b/src/libstd/rt/io/mod.rs index 116d240308a..038fca9a1ad 100644 --- a/src/libstd/rt/io/mod.rs +++ b/src/libstd/rt/io/mod.rs @@ -268,6 +268,9 @@ pub use self::extensions::WriterByteConversions; /// Synchronous, non-blocking file I/O. pub mod file; +/// Synchronous, in-memory I/O. +pub mod pipe; + /// Synchronous, non-blocking network I/O. pub mod net { pub mod tcp; diff --git a/src/libstd/rt/io/net/tcp.rs b/src/libstd/rt/io/net/tcp.rs index 85fb5d08848..dc7135f4a61 100644 --- a/src/libstd/rt/io/net/tcp.rs +++ b/src/libstd/rt/io/net/tcp.rs @@ -16,7 +16,7 @@ use rt::io::{io_error, read_error, EndOfFile}; use rt::rtio::{IoFactory, IoFactoryObject, RtioSocket, RtioTcpListener, RtioTcpListenerObject, RtioTcpStream, - RtioTcpStreamObject}; + RtioTcpStreamObject, RtioStream}; use rt::local::Local; pub struct TcpStream(~RtioTcpStreamObject); @@ -69,7 +69,7 @@ impl TcpStream { impl Reader for TcpStream { fn read(&mut self, buf: &mut [u8]) -> Option { - match (**self).read(buf) { + match (***self).read(buf) { Ok(read) => Some(read), Err(ioerr) => { // EOF is indicated by returning None @@ -86,7 +86,7 @@ impl Reader for TcpStream { impl Writer for TcpStream { fn write(&mut self, buf: &[u8]) { - match (**self).write(buf) { + match (***self).write(buf) { Ok(_) => (), Err(ioerr) => io_error::cond.raise(ioerr), } diff --git a/src/libstd/rt/io/pipe.rs b/src/libstd/rt/io/pipe.rs new file mode 100644 index 00000000000..02b3d0fe57d --- /dev/null +++ b/src/libstd/rt/io/pipe.rs @@ -0,0 +1,77 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Synchronous, in-memory pipes. +//! +//! Currently these aren't particularly useful, there only exists bindings +//! enough so that pipes can be created to child processes. + +use prelude::*; +use super::{Reader, Writer}; +use rt::io::{io_error, read_error, EndOfFile}; +use rt::local::Local; +use rt::rtio::{RtioPipeObject, RtioStream, IoFactoryObject, IoFactory}; +use rt::uv::pipe; + +pub struct PipeStream(~RtioPipeObject); + +impl PipeStream { + /// Creates a new pipe initialized, but not bound to any particular + /// source/destination + pub fn new() -> Option { + let pipe = unsafe { + let io: *mut IoFactoryObject = Local::unsafe_borrow(); + (*io).pipe_init(false) + }; + match pipe { + Ok(p) => Some(PipeStream(p)), + Err(ioerr) => { + io_error::cond.raise(ioerr); + None + } + } + } + + /// Extracts the underlying libuv pipe to be bound to another source. + pub fn uv_pipe(&self) -> pipe::Pipe { + // Did someone say multiple layers of indirection? + (**self).uv_pipe() + } +} + +impl Reader for PipeStream { + fn read(&mut self, buf: &mut [u8]) -> Option { + match (***self).read(buf) { + Ok(read) => Some(read), + Err(ioerr) => { + // EOF is indicated by returning None + if ioerr.kind != EndOfFile { + read_error::cond.raise(ioerr); + } + return None; + } + } + } + + fn eof(&mut self) -> bool { fail!() } +} + +impl Writer for PipeStream { + fn write(&mut self, buf: &[u8]) { + match (***self).write(buf) { + Ok(_) => (), + Err(ioerr) => { + io_error::cond.raise(ioerr); + } + } + } + + fn flush(&mut self) { fail!() } +} -- cgit 1.4.1-3-g733a5