aboutsummaryrefslogtreecommitdiff
path: root/ctr-std/src/io/stdio.rs
diff options
context:
space:
mode:
authorFenrirWolf <[email protected]>2018-04-21 16:39:03 -0600
committerGitHub <[email protected]>2018-04-21 16:39:03 -0600
commit159b5b9e62ce074bbbd1900137670a9f5426a8bd (patch)
tree4fecd0ca00b754c494e96b13e9837db48de93109 /ctr-std/src/io/stdio.rs
parentMove more implementation details to `imp` module (diff)
parentUpdate for Rust nightly 2018-04-19 (diff)
downloadarchived-ctru-rs-159b5b9e62ce074bbbd1900137670a9f5426a8bd.tar.xz
archived-ctru-rs-159b5b9e62ce074bbbd1900137670a9f5426a8bd.zip
Merge pull request #64 from FenrirWolf/nightly-update
Update for Rust nightly 2018-04-19
Diffstat (limited to 'ctr-std/src/io/stdio.rs')
-rw-r--r--ctr-std/src/io/stdio.rs148
1 files changed, 75 insertions, 73 deletions
diff --git a/ctr-std/src/io/stdio.rs b/ctr-std/src/io/stdio.rs
index 831688b..2472bed 100644
--- a/ctr-std/src/io/stdio.rs
+++ b/ctr-std/src/io/stdio.rs
@@ -17,7 +17,7 @@ use io::{self, Initializer, BufReader, LineWriter};
use sync::{Arc, Mutex, MutexGuard};
use sys::stdio;
use sys_common::remutex::{ReentrantMutex, ReentrantMutexGuard};
-use thread::{LocalKey, LocalKeyState};
+use thread::LocalKey;
/// Stdout used by print! and println! macros
thread_local! {
@@ -171,29 +171,29 @@ pub struct StdinLock<'a> {
///
/// Using implicit synchronization:
///
-/// ```
+/// ```no_run
/// use std::io::{self, Read};
///
-/// # fn foo() -> io::Result<String> {
-/// let mut buffer = String::new();
-/// io::stdin().read_to_string(&mut buffer)?;
-/// # Ok(buffer)
-/// # }
+/// fn main() -> io::Result<()> {
+/// let mut buffer = String::new();
+/// io::stdin().read_to_string(&mut buffer)?;
+/// Ok(())
+/// }
/// ```
///
/// Using explicit synchronization:
///
-/// ```
+/// ```no_run
/// use std::io::{self, Read};
///
-/// # fn foo() -> io::Result<String> {
-/// let mut buffer = String::new();
-/// let stdin = io::stdin();
-/// let mut handle = stdin.lock();
+/// fn main() -> io::Result<()> {
+/// let mut buffer = String::new();
+/// let stdin = io::stdin();
+/// let mut handle = stdin.lock();
///
-/// handle.read_to_string(&mut buffer)?;
-/// # Ok(buffer)
-/// # }
+/// handle.read_to_string(&mut buffer)?;
+/// Ok(())
+/// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn stdin() -> Stdin {
@@ -225,17 +225,17 @@ impl Stdin {
///
/// # Examples
///
- /// ```
+ /// ```no_run
/// use std::io::{self, Read};
///
- /// # fn foo() -> io::Result<String> {
- /// let mut buffer = String::new();
- /// let stdin = io::stdin();
- /// let mut handle = stdin.lock();
+ /// fn main() -> io::Result<()> {
+ /// let mut buffer = String::new();
+ /// let stdin = io::stdin();
+ /// let mut handle = stdin.lock();
///
- /// handle.read_to_string(&mut buffer)?;
- /// # Ok(buffer)
- /// # }
+ /// handle.read_to_string(&mut buffer)?;
+ /// Ok(())
+ /// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn lock(&self) -> StdinLock {
@@ -369,29 +369,29 @@ pub struct StdoutLock<'a> {
///
/// Using implicit synchronization:
///
-/// ```
+/// ```no_run
/// use std::io::{self, Write};
///
-/// # fn foo() -> io::Result<()> {
-/// io::stdout().write(b"hello world")?;
+/// fn main() -> io::Result<()> {
+/// io::stdout().write(b"hello world")?;
///
-/// # Ok(())
-/// # }
+/// Ok(())
+/// }
/// ```
///
/// Using explicit synchronization:
///
-/// ```
+/// ```no_run
/// use std::io::{self, Write};
///
-/// # fn foo() -> io::Result<()> {
-/// let stdout = io::stdout();
-/// let mut handle = stdout.lock();
+/// fn main() -> io::Result<()> {
+/// let stdout = io::stdout();
+/// let mut handle = stdout.lock();
///
-/// handle.write(b"hello world")?;
+/// handle.write(b"hello world")?;
///
-/// # Ok(())
-/// # }
+/// Ok(())
+/// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn stdout() -> Stdout {
@@ -419,17 +419,17 @@ impl Stdout {
///
/// # Examples
///
- /// ```
+ /// ```no_run
/// use std::io::{self, Write};
///
- /// # fn foo() -> io::Result<()> {
- /// let stdout = io::stdout();
- /// let mut handle = stdout.lock();
+ /// fn main() -> io::Result<()> {
+ /// let stdout = io::stdout();
+ /// let mut handle = stdout.lock();
///
- /// handle.write(b"hello world")?;
+ /// handle.write(b"hello world")?;
///
- /// # Ok(())
- /// # }
+ /// Ok(())
+ /// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn lock(&self) -> StdoutLock {
@@ -505,29 +505,29 @@ pub struct StderrLock<'a> {
///
/// Using implicit synchronization:
///
-/// ```
+/// ```no_run
/// use std::io::{self, Write};
///
-/// # fn foo() -> io::Result<()> {
-/// io::stderr().write(b"hello world")?;
+/// fn main() -> io::Result<()> {
+/// io::stderr().write(b"hello world")?;
///
-/// # Ok(())
-/// # }
+/// Ok(())
+/// }
/// ```
///
/// Using explicit synchronization:
///
-/// ```
+/// ```no_run
/// use std::io::{self, Write};
///
-/// # fn foo() -> io::Result<()> {
-/// let stderr = io::stderr();
-/// let mut handle = stderr.lock();
+/// fn main() -> io::Result<()> {
+/// let stderr = io::stderr();
+/// let mut handle = stderr.lock();
///
-/// handle.write(b"hello world")?;
+/// handle.write(b"hello world")?;
///
-/// # Ok(())
-/// # }
+/// Ok(())
+/// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn stderr() -> Stderr {
@@ -663,29 +663,31 @@ pub fn set_print(sink: Option<Box<Write + Send>>) -> Option<Box<Write + Send>> {
///
/// This function is used to print error messages, so it takes extra
/// care to avoid causing a panic when `local_stream` is unusable.
-/// For instance, if the TLS key for the local stream is uninitialized
-/// or already destroyed, or if the local stream is locked by another
+/// For instance, if the TLS key for the local stream is
+/// already destroyed, or if the local stream is locked by another
/// thread, it will just fall back to the global stream.
///
/// However, if the actual I/O causes an error, this function does panic.
-fn print_to<T>(args: fmt::Arguments,
- local_s: &'static LocalKey<RefCell<Option<Box<Write+Send>>>>,
- global_s: fn() -> T,
- label: &str) where T: Write {
- let result = match local_s.state() {
- LocalKeyState::Uninitialized |
- LocalKeyState::Destroyed => global_s().write_fmt(args),
- LocalKeyState::Valid => {
- local_s.with(|s| {
- if let Ok(mut borrowed) = s.try_borrow_mut() {
- if let Some(w) = borrowed.as_mut() {
- return w.write_fmt(args);
- }
- }
- global_s().write_fmt(args)
- })
+fn print_to<T>(
+ args: fmt::Arguments,
+ local_s: &'static LocalKey<RefCell<Option<Box<Write+Send>>>>,
+ global_s: fn() -> T,
+ label: &str,
+)
+where
+ T: Write,
+{
+ let result = local_s.try_with(|s| {
+ if let Ok(mut borrowed) = s.try_borrow_mut() {
+ if let Some(w) = borrowed.as_mut() {
+ return w.write_fmt(args);
+ }
}
- };
+ global_s().write_fmt(args)
+ }).unwrap_or_else(|_| {
+ global_s().write_fmt(args)
+ });
+
if let Err(e) = result {
panic!("failed printing to {}: {}", label, e);
}