Browse Source

Properly set up main thread

pull/10/head
Fenrir 8 years ago
parent
commit
b2ba0fa9af
  1. 27
      ctr-std/src/panicking.rs
  2. 17
      ctr-std/src/rt.rs

27
ctr-std/src/panicking.rs

@ -354,25 +354,17 @@ fn default_hook(info: &PanicInfo) {
}; };
// 3DS-specific code begins here // 3DS-specific code begins here
use libctru::{consoleInit, consoleDebugInit, debugDevice, use libctru::{consoleDebugInit, debugDevice};
consoleClear, gfxScreen_t, threadGetCurrent};
use sys::stdio::Stderr; use sys::stdio::Stderr;
let mut err = Stderr::new().ok(); let mut err = Stderr::new().ok();
let thread = thread_info::current_thread(); let thread = thread_info::current_thread();
let name; let name = thread.as_ref()
.and_then(|t| t.name())
.unwrap_or("<unnamed>");
unsafe { unsafe {
// Set up a new console, overwriting whatever was on the bottom screen
// before we started panicking
let _console = consoleInit(gfxScreen_t::GFX_BOTTOM, ptr::null_mut());
consoleClear();
consoleDebugInit(debugDevice::debugDevice_CONSOLE); consoleDebugInit(debugDevice::debugDevice_CONSOLE);
// Determine thread name
name = thread.as_ref()
.and_then(|t| t.name())
.unwrap_or(if threadGetCurrent() == ptr::null_mut() {"main"} else {"<unnamed>"});
} }
let write = |err: &mut ::io::Write| { let write = |err: &mut ::io::Write| {
@ -405,10 +397,6 @@ fn default_hook(info: &PanicInfo) {
(None, Some(ref mut err)) => { write(err) } (None, Some(ref mut err)) => { write(err) }
_ => {} _ => {}
} }
// Citra will crash and die horribly if we allow it to go further than this,
// So we just trap control flow in this loop instead. You'll still see the panic
// message, and Citra won't die quite as horribly. It's a win-win! Well, mostly.
loop { }
} }
#[cfg(not(feature = "citra"))] #[cfg(not(feature = "citra"))]
@ -441,17 +429,18 @@ fn default_hook(info: &PanicInfo) {
} }
}; };
// 3DS-specific code begins here // 3DS-specific code begins here
use libctru::{errorInit, errorText, errorDisp, threadGetCurrent, use libctru::{errorInit, errorText, errorDisp,
errorConf, errorType, CFG_Language}; errorConf, errorType, CFG_Language};
use libc; use libc;
unsafe {
let thread = thread_info::current_thread(); let thread = thread_info::current_thread();
let name = thread.as_ref() let name = thread.as_ref()
.and_then(|t| t.name()) .and_then(|t| t.name())
.unwrap_or(if threadGetCurrent() == ptr::null_mut() {"main"} else {"<unnamed>"}); .unwrap_or("<unnamed>");
unsafe {
// Setup error payload // Setup error payload
let error_text = format!("thread '{}' panicked at '{}', {}:{}:{}", let error_text = format!("thread '{}' panicked at '{}', {}:{}:{}",
name, msg, file, line, col); name, msg, file, line, col);

17
ctr-std/src/rt.rs

@ -23,6 +23,8 @@
#![doc(hidden)] #![doc(hidden)]
use panic; use panic;
use sys_common::thread_info;
use thread::Thread;
use mem; use mem;
// Reexport some of our utilities which are expected by other crates. // Reexport some of our utilities which are expected by other crates.
@ -32,8 +34,19 @@ pub use panicking::{begin_panic, begin_panic_fmt};
#[lang = "start"] #[lang = "start"]
#[allow(unused_variables)] #[allow(unused_variables)]
fn lang_start(main: *const u8, argc: isize, argv: *const *const u8) -> isize { fn lang_start(main: *const u8, argc: isize, argv: *const *const u8) -> isize {
let _ = unsafe { let failed = unsafe {
panic::catch_unwind(mem::transmute::<_, fn()>(main)) let thread = Thread::new(Some("main".to_owned()));
thread_info::set(None, thread);
let res = panic::catch_unwind(mem::transmute::<_, fn()>(main));
res.is_err()
}; };
if failed {
101
} else {
0 0
}
} }

Loading…
Cancel
Save