use mem;
use ptr;
use raw;
-use sys::stdio::{Stderr, stderr_prints_nothing};
+use sys::stdio::panic_output;
use sys_common::rwlock::RWLock;
use sys_common::thread_info;
use sys_common::util;
None => "Box<Any>",
}
};
- let mut err = Stderr::new().ok();
let thread = thread_info::current_thread();
let name = thread.as_ref().and_then(|t| t.name()).unwrap_or("<unnamed>");
}
};
- let prev = LOCAL_STDERR.with(|s| s.borrow_mut().take());
- match (prev, err.as_mut()) {
- (Some(mut stderr), _) => {
- write(&mut *stderr);
- let mut s = Some(stderr);
- LOCAL_STDERR.with(|slot| {
- *slot.borrow_mut() = s.take();
- });
- }
- (None, Some(ref mut err)) => { write(err) }
- _ => {}
+ if let Some(mut local) = LOCAL_STDERR.with(|s| s.borrow_mut().take()) {
+ write(&mut *local);
+ let mut s = Some(local);
+ LOCAL_STDERR.with(|slot| {
+ *slot.borrow_mut() = s.take();
+ });
+ } else if let Some(mut out) = panic_output() {
+ write(&mut out);
}
}
// Some platforms know that printing to stderr won't ever actually
// print anything, and if that's the case we can skip the default
// hook.
- Hook::Default if stderr_prints_nothing() => {}
+ Hook::Default if panic_output().is_none() => {}
Hook::Default => {
info.set_payload(payload.get());
default_hook(&info);
info.set_payload(payload.get());
(*ptr)(&info);
}
- }
+ };
HOOK_LOCK.read_unlock();
}
use fmt;
use io::prelude::*;
-use sys::stdio::{Stderr, stderr_prints_nothing};
+use sys::stdio::panic_output;
use thread;
pub fn dumb_print(args: fmt::Arguments) {
- if stderr_prints_nothing() {
- return
+ if let Some(mut out) = panic_output() {
+ let _ = out.write_fmt(args);
}
- let _ = Stderr::new().map(|mut stderr| stderr.write_fmt(args));
}
// Other platforms should use the appropriate platform-specific mechanism for