diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2015-03-30 20:18:16 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2015-03-30 20:18:16 +0530 |
| commit | 3b4547010011b948168d64eb8d05a5cfa7652765 (patch) | |
| tree | d3e133c446a8aab157f145122223c7d2ab944dc1 /src/libstd/io | |
| parent | db50084cd9d83f7b342f481c2d03f78b50d99059 (diff) | |
| parent | d9252bde18360e5815f0d83a83efd597bc6bb5b7 (diff) | |
| download | rust-3b4547010011b948168d64eb8d05a5cfa7652765.tar.gz rust-3b4547010011b948168d64eb8d05a5cfa7652765.zip | |
Rollup merge of #23855 - tshepang:doc-nit, r=Manishearth
Diffstat (limited to 'src/libstd/io')
| -rw-r--r-- | src/libstd/io/buffered.rs | 6 | ||||
| -rw-r--r-- | src/libstd/io/mod.rs | 9 | ||||
| -rw-r--r-- | src/libstd/io/stdio.rs | 24 |
3 files changed, 20 insertions, 19 deletions
diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 2a1294f23b2..998f37e6a68 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -98,7 +98,7 @@ impl<R: Read> BufRead for BufReader<R> { self.buf.fill_buf() } - fn consume(&mut self, amt: uint) { + fn consume(&mut self, amt: usize) { self.buf.consume(amt) } } @@ -427,7 +427,7 @@ impl<S: Read + Write> BufStream<S> { #[stable(feature = "rust1", since = "1.0.0")] impl<S: Read + Write> BufRead for BufStream<S> { fn fill_buf(&mut self) -> io::Result<&[u8]> { self.inner.fill_buf() } - fn consume(&mut self, amt: uint) { self.inner.consume(amt) } + fn consume(&mut self, amt: usize) { self.inner.consume(amt) } } #[stable(feature = "rust1", since = "1.0.0")] @@ -681,7 +681,7 @@ mod tests { } #[test] - #[should_fail] + #[should_panic] fn dont_panic_in_drop_on_panicked_flush() { struct FailFlushWriter; diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 0ed6d07bf79..be0b3687bad 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -16,7 +16,7 @@ use cmp; use unicode::str as core_str; use error as std_error; use fmt; -use iter::{self, Iterator, IteratorExt, Extend}; +use iter::{self, Iterator, Extend}; use marker::Sized; use ops::{Drop, FnOnce}; use option::Option::{self, Some, None}; @@ -609,8 +609,7 @@ pub trait BufRead: Read { /// /// This function will yield errors whenever `read_until` would have also /// yielded an error. - #[unstable(feature = "io", reason = "may be renamed to not conflict with \ - SliceExt::split")] + #[stable(feature = "rust1", since = "1.0.0")] fn split(self, byte: u8) -> Split<Self> where Self: Sized { Split { buf: self, delim: byte } } @@ -854,13 +853,13 @@ impl fmt::Display for CharsError { /// particular byte. /// /// See `BufReadExt::split` for more information. -#[unstable(feature = "io", reason = "awaiting stability of BufReadExt::split")] +#[stable(feature = "rust1", since = "1.0.0")] pub struct Split<B> { buf: B, delim: u8, } -#[unstable(feature = "io", reason = "awaiting stability of BufReadExt::split")] +#[stable(feature = "rust1", since = "1.0.0")] impl<B: BufRead> Iterator for Split<B> { type Item = Result<Vec<u8>>; diff --git a/src/libstd/io/stdio.rs b/src/libstd/io/stdio.rs index 53f67766ea6..d361f17cbe4 100644 --- a/src/libstd/io/stdio.rs +++ b/src/libstd/io/stdio.rs @@ -11,7 +11,7 @@ use prelude::v1::*; use io::prelude::*; -use cell::RefCell; +use cell::{RefCell, BorrowState}; use cmp; use fmt; use io::lazy::Lazy; @@ -264,9 +264,8 @@ impl Write for Stdout { fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { self.lock().write_all(buf) } - fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { - self.lock().write_fmt(fmt) - } + // Don't override write_fmt as it's possible to run arbitrary code during a + // write_fmt, allowing the possibility of a recursive lock (aka deadlock) } #[stable(feature = "rust1", since = "1.0.0")] impl<'a> Write for StdoutLock<'a> { @@ -334,9 +333,7 @@ impl Write for Stderr { fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { self.lock().write_all(buf) } - fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { - self.lock().write_fmt(fmt) - } + // Don't override write_fmt for the same reasons as Stdout } #[stable(feature = "rust1", since = "1.0.0")] impl<'a> Write for StderrLock<'a> { @@ -395,10 +392,15 @@ pub fn set_print(sink: Box<Write + Send>) -> Option<Box<Write + Send>> { reason = "implementation detail which may disappear or be replaced at any time")] #[doc(hidden)] pub fn _print(args: fmt::Arguments) { - if let Err(e) = LOCAL_STDOUT.with(|s| match s.borrow_mut().as_mut() { - Some(w) => w.write_fmt(args), - None => stdout().write_fmt(args) - }) { + let result = LOCAL_STDOUT.with(|s| { + if s.borrow_state() == BorrowState::Unused { + if let Some(w) = s.borrow_mut().as_mut() { + return w.write_fmt(args); + } + } + stdout().write_fmt(args) + }); + if let Err(e) = result { panic!("failed printing to stdout: {}", e); } } |
