about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-02-28 12:55:30 -0800
committerAlex Crichton <alex@alexcrichton.com>2014-03-01 10:06:20 -0800
commit2cb83fdd7ea4e76d4b1c830a97480521cc405625 (patch)
treedc3f78a323c4d2c875fdb98f1b2b9d49b70759ef /src
parent1ee94a1336071fb0319b23a6c73b3d83ccd66bdf (diff)
downloadrust-2cb83fdd7ea4e76d4b1c830a97480521cc405625.tar.gz
rust-2cb83fdd7ea4e76d4b1c830a97480521cc405625.zip
std: Switch stdout/stderr to buffered by default
Similarly to #12422 which made stdin buffered by default, this commit makes the
output streams also buffered by default. Now that buffered writers will flush
their contents when they are dropped, I don't believe that there's no reason why
the output shouldn't be buffered by default, which is what you want in 90% of
cases.

As with stdin, there are new stdout_raw() and stderr_raw() functions to get
unbuffered streams to stdout/stderr.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/lib.rs3
-rw-r--r--src/libstd/fmt/mod.rs4
-rw-r--r--src/libstd/io/stdio.rs34
-rw-r--r--src/libstd/logging.rs4
-rw-r--r--src/libsyntax/diagnostic.rs4
-rw-r--r--src/libtest/lib.rs4
-rw-r--r--src/test/bench/shootout-fasta-redux.rs4
-rw-r--r--src/test/bench/shootout-fasta.rs2
-rw-r--r--src/test/bench/shootout-mandelbrot.rs3
9 files changed, 41 insertions, 21 deletions
diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs
index c5b4147f090..2e3b9be5f9b 100644
--- a/src/librustc/lib.rs
+++ b/src/librustc/lib.rs
@@ -297,8 +297,7 @@ pub fn run_compiler(args: &[~str]) {
         match input {
           d::FileInput(ref ifile) => {
             let mut stdout = io::stdout();
-            d::list_metadata(sess, &(*ifile),
-                             &mut stdout as &mut io::Writer).unwrap();
+            d::list_metadata(sess, &(*ifile), &mut stdout).unwrap();
           }
           d::StrInput(_) => {
             d::early_error("can not list metadata for stdin");
diff --git a/src/libstd/fmt/mod.rs b/src/libstd/fmt/mod.rs
index bdc1aa75c94..67e2fc00b8b 100644
--- a/src/libstd/fmt/mod.rs
+++ b/src/libstd/fmt/mod.rs
@@ -654,8 +654,8 @@ uniform_fn_call_workaround! {
 /// use std::fmt;
 /// use std::io;
 ///
-/// let w = &mut io::stdout() as &mut io::Writer;
-/// format_args!(|args| { fmt::write(w, args); }, "Hello, {}!", "world");
+/// let mut w = io::stdout();
+/// format_args!(|args| { fmt::write(&mut w, args); }, "Hello, {}!", "world");
 /// ```
 pub fn write(output: &mut io::Writer, args: &Arguments) -> Result {
     unsafe { write_unsafe(output, args.fmt, args.args) }
diff --git a/src/libstd/io/stdio.rs b/src/libstd/io/stdio.rs
index b125fd69c5a..241f3d23c6b 100644
--- a/src/libstd/io/stdio.rs
+++ b/src/libstd/io/stdio.rs
@@ -90,6 +90,12 @@ fn src<T>(fd: libc::c_int, readable: bool, f: |StdSource| -> T) -> T {
 /// buffered access is not desired, the `stdin_raw` function is provided to
 /// provided unbuffered access to stdin.
 ///
+/// Care should be taken when creating multiple handles to the stdin of a
+/// process. Beause this is a buffered reader by default, it's possible for
+/// pending input to be unconsumed in one reader and unavailable to other
+/// readers. It is recommended that only one handle at a time is created for the
+/// stdin of a process.
+///
 /// See `stdout()` for more notes about this function.
 pub fn stdin() -> BufferedReader<StdReader> {
     BufferedReader::new(stdin_raw())
@@ -104,20 +110,38 @@ pub fn stdin_raw() -> StdReader {
     src(libc::STDIN_FILENO, true, |src| StdReader { inner: src })
 }
 
-/// Creates a new non-blocking handle to the stdout of the current process.
+/// Creates a line-buffered handle to the stdout of the current process.
 ///
 /// Note that this is a fairly expensive operation in that at least one memory
 /// allocation is performed. Additionally, this must be called from a runtime
 /// task context because the stream returned will be a non-blocking object using
 /// the local scheduler to perform the I/O.
-pub fn stdout() -> StdWriter {
+///
+/// Care should be taken when creating multiple handles to an output stream for
+/// a single process. While usage is still safe, the output may be surprising if
+/// no synchronization is performed to ensure a sane output.
+pub fn stdout() -> LineBufferedWriter<StdWriter> {
+    LineBufferedWriter::new(stdout_raw())
+}
+
+/// Creates an unbuffered handle to the stdout of the current process
+///
+/// See notes in `stdout()` for more information.
+pub fn stdout_raw() -> StdWriter {
     src(libc::STDOUT_FILENO, false, |src| StdWriter { inner: src })
 }
 
-/// Creates a new non-blocking handle to the stderr of the current process.
+/// Creates a line-buffered handle to the stderr of the current process.
 ///
 /// See `stdout()` for notes about this function.
-pub fn stderr() -> StdWriter {
+pub fn stderr() -> LineBufferedWriter<StdWriter> {
+    LineBufferedWriter::new(stderr_raw())
+}
+
+/// Creates an unbuffered handle to the stderr of the current process
+///
+/// See notes in `stdout()` for more information.
+pub fn stderr_raw() -> StdWriter {
     src(libc::STDERR_FILENO, false, |src| StdWriter { inner: src })
 }
 
@@ -182,7 +206,7 @@ fn with_task_stdout(f: |&mut Writer| -> IoResult<()> ) {
             Local::put(task);
 
             if my_stdout.is_none() {
-                my_stdout = Some(~LineBufferedWriter::new(stdout()) as ~Writer);
+                my_stdout = Some(~stdout() as ~Writer);
             }
             let ret = f(*my_stdout.get_mut_ref());
 
diff --git a/src/libstd/logging.rs b/src/libstd/logging.rs
index 39a62a80cfc..2271a7c2380 100644
--- a/src/libstd/logging.rs
+++ b/src/libstd/logging.rs
@@ -166,9 +166,7 @@ pub fn log(level: u32, args: &fmt::Arguments) {
     };
 
     if logger.is_none() {
-        logger = Some(~DefaultLogger {
-            handle: LineBufferedWriter::new(io::stderr()),
-        } as ~Logger);
+        logger = Some(~DefaultLogger { handle: io::stderr(), } as ~Logger);
     }
     logger.get_mut_ref().log(level, args);
 
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs
index affeb86f782..cb7034a375d 100644
--- a/src/libsyntax/diagnostic.rs
+++ b/src/libsyntax/diagnostic.rs
@@ -227,8 +227,8 @@ enum Destination {
 impl EmitterWriter {
     pub fn stderr() -> EmitterWriter {
         let stderr = io::stderr();
-        if stderr.isatty() {
-            let dst = match term::Terminal::new(stderr) {
+        if stderr.get_ref().isatty() {
+            let dst = match term::Terminal::new(stderr.unwrap()) {
                 Ok(t) => Terminal(t),
                 Err(..) => Raw(~io::stderr()),
             };
diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs
index 3162fe02a0f..0e062003053 100644
--- a/src/libtest/lib.rs
+++ b/src/libtest/lib.rs
@@ -415,8 +415,8 @@ impl<T: Writer> ConsoleTestState<T> {
             Some(ref path) => Some(try!(File::create(path))),
             None => None
         };
-        let out = match term::Terminal::new(io::stdout()) {
-            Err(_) => Raw(io::stdout()),
+        let out = match term::Terminal::new(io::stdio::stdout_raw()) {
+            Err(_) => Raw(io::stdio::stdout_raw()),
             Ok(t) => Pretty(t)
         };
         Ok(ConsoleTestState {
diff --git a/src/test/bench/shootout-fasta-redux.rs b/src/test/bench/shootout-fasta-redux.rs
index f38acf0457d..532bc714d31 100644
--- a/src/test/bench/shootout-fasta-redux.rs
+++ b/src/test/bench/shootout-fasta-redux.rs
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 use std::cmp::min;
-use std::io::{stdout, BufferedWriter, IoResult};
+use std::io::{stdout, IoResult};
 use std::os;
 use std::vec::bytes::copy_memory;
 use std::vec;
@@ -183,7 +183,7 @@ fn main() {
         5
     };
 
-    let mut out = BufferedWriter::new(stdout());
+    let mut out = stdout();
 
     out.write_line(">ONE Homo sapiens alu").unwrap();
     {
diff --git a/src/test/bench/shootout-fasta.rs b/src/test/bench/shootout-fasta.rs
index f0c3517a0b8..ae0bd069c90 100644
--- a/src/test/bench/shootout-fasta.rs
+++ b/src/test/bench/shootout-fasta.rs
@@ -117,6 +117,6 @@ fn main() {
         let mut file = BufferedWriter::new(File::create(&Path::new("./shootout-fasta.data")));
         run(&mut file);
     } else {
-        run(&mut BufferedWriter::new(io::stdout()));
+        run(&mut io::stdout());
     }
 }
diff --git a/src/test/bench/shootout-mandelbrot.rs b/src/test/bench/shootout-mandelbrot.rs
index 6f4a4c43b03..2bff20d52f8 100644
--- a/src/test/bench/shootout-mandelbrot.rs
+++ b/src/test/bench/shootout-mandelbrot.rs
@@ -9,7 +9,6 @@
 // except according to those terms.
 
 use std::io;
-use std::io::BufferedWriter;
 
 struct DummyWriter;
 impl Writer for DummyWriter {
@@ -27,7 +26,7 @@ fn main() {
         (1000, ~DummyWriter as ~Writer)
     } else {
         (from_str(args[1]).unwrap(),
-         ~BufferedWriter::new(std::io::stdout()) as ~Writer)
+         ~std::io::stdout() as ~Writer)
     };
     let h = w;
     let mut byte_acc = 0u8;