Skip to content

Commit

Permalink
Use LocalKey::try_with in std
Browse files Browse the repository at this point in the history
  • Loading branch information
PlasmaPower committed Jul 11, 2017
1 parent 32ae12b commit a45c8b0
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 22 deletions.
22 changes: 8 additions & 14 deletions src/libstd/io/stdio.rs
Expand Up @@ -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! {
Expand Down Expand Up @@ -674,20 +674,14 @@ 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)
})
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);
}
Expand Down
11 changes: 3 additions & 8 deletions src/libstd/sys_common/thread_info.rs
Expand Up @@ -12,7 +12,6 @@

use cell::RefCell;
use thread::Thread;
use thread::LocalKeyState;

struct ThreadInfo {
stack_guard: Option<usize>,
Expand All @@ -23,19 +22,15 @@ thread_local! { static THREAD_INFO: RefCell<Option<ThreadInfo>> = RefCell::new(N

impl ThreadInfo {
fn with<R, F>(f: F) -> Option<R> where F: FnOnce(&mut ThreadInfo) -> R {
if THREAD_INFO.state() == LocalKeyState::Destroyed {
return None
}

THREAD_INFO.with(move |c| {
THREAD_INFO.try_with(move |c| {
if c.borrow().is_none() {
*c.borrow_mut() = Some(ThreadInfo {
stack_guard: None,
thread: Thread::new(None),
})
}
Some(f(c.borrow_mut().as_mut().unwrap()))
})
f(c.borrow_mut().as_mut().unwrap())
}).ok()
}
}

Expand Down

0 comments on commit a45c8b0

Please sign in to comment.