Rollup merge of #89068 - bjorn3:restructure_rt2, r=joshtriplett
Restructure std::rt (part 2) A couple more cleanups on top of https://github.com/rust-lang/rust/pull/89011 Blocked on #89011
This commit is contained in:
commit
6c5aa765fb
4 changed files with 13 additions and 16 deletions
|
@ -299,9 +299,7 @@ mod util;
|
||||||
|
|
||||||
const DEFAULT_BUF_SIZE: usize = crate::sys_common::io::DEFAULT_BUF_SIZE;
|
const DEFAULT_BUF_SIZE: usize = crate::sys_common::io::DEFAULT_BUF_SIZE;
|
||||||
|
|
||||||
pub(crate) fn cleanup() {
|
pub(crate) use stdio::cleanup;
|
||||||
stdio::cleanup()
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Guard<'a> {
|
struct Guard<'a> {
|
||||||
buf: &'a mut Vec<u8>,
|
buf: &'a mut Vec<u8>,
|
||||||
|
|
|
@ -128,8 +128,7 @@ fn lang_start_internal(
|
||||||
let ret_code = panic::catch_unwind(move || panic::catch_unwind(main).unwrap_or(101) as isize)
|
let ret_code = panic::catch_unwind(move || panic::catch_unwind(main).unwrap_or(101) as isize)
|
||||||
.map_err(move |e| {
|
.map_err(move |e| {
|
||||||
mem::forget(e);
|
mem::forget(e);
|
||||||
rtprintpanic!("drop of the panic payload panicked");
|
rtabort!("drop of the panic payload panicked");
|
||||||
sys::abort_internal()
|
|
||||||
});
|
});
|
||||||
panic::catch_unwind(cleanup).map_err(rt_abort)?;
|
panic::catch_unwind(cleanup).map_err(rt_abort)?;
|
||||||
ret_code
|
ret_code
|
||||||
|
|
|
@ -6,7 +6,7 @@ pub use self::imp::cleanup;
|
||||||
pub use self::imp::init;
|
pub use self::imp::init;
|
||||||
|
|
||||||
pub struct Handler {
|
pub struct Handler {
|
||||||
_data: *mut libc::c_void,
|
data: *mut libc::c_void,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Handler {
|
impl Handler {
|
||||||
|
@ -15,14 +15,14 @@ impl Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn null() -> Handler {
|
fn null() -> Handler {
|
||||||
Handler { _data: crate::ptr::null_mut() }
|
Handler { data: crate::ptr::null_mut() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Handler {
|
impl Drop for Handler {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
drop_handler(self);
|
drop_handler(self.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -134,12 +134,12 @@ mod imp {
|
||||||
}
|
}
|
||||||
|
|
||||||
let handler = make_handler();
|
let handler = make_handler();
|
||||||
MAIN_ALTSTACK.store(handler._data, Ordering::Relaxed);
|
MAIN_ALTSTACK.store(handler.data, Ordering::Relaxed);
|
||||||
mem::forget(handler);
|
mem::forget(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn cleanup() {
|
pub unsafe fn cleanup() {
|
||||||
Handler { _data: MAIN_ALTSTACK.load(Ordering::Relaxed) };
|
drop_handler(MAIN_ALTSTACK.load(Ordering::Relaxed));
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn get_stackp() -> *mut libc::c_void {
|
unsafe fn get_stackp() -> *mut libc::c_void {
|
||||||
|
@ -176,14 +176,14 @@ mod imp {
|
||||||
if stack.ss_flags & SS_DISABLE != 0 {
|
if stack.ss_flags & SS_DISABLE != 0 {
|
||||||
stack = get_stack();
|
stack = get_stack();
|
||||||
sigaltstack(&stack, ptr::null_mut());
|
sigaltstack(&stack, ptr::null_mut());
|
||||||
Handler { _data: stack.ss_sp as *mut libc::c_void }
|
Handler { data: stack.ss_sp as *mut libc::c_void }
|
||||||
} else {
|
} else {
|
||||||
Handler::null()
|
Handler::null()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn drop_handler(handler: &mut Handler) {
|
pub unsafe fn drop_handler(data: *mut libc::c_void) {
|
||||||
if !handler._data.is_null() {
|
if !data.is_null() {
|
||||||
let stack = libc::stack_t {
|
let stack = libc::stack_t {
|
||||||
ss_sp: ptr::null_mut(),
|
ss_sp: ptr::null_mut(),
|
||||||
ss_flags: SS_DISABLE,
|
ss_flags: SS_DISABLE,
|
||||||
|
@ -196,7 +196,7 @@ mod imp {
|
||||||
sigaltstack(&stack, ptr::null_mut());
|
sigaltstack(&stack, ptr::null_mut());
|
||||||
// We know from `get_stackp` that the alternate stack we installed is part of a mapping
|
// We know from `get_stackp` that the alternate stack we installed is part of a mapping
|
||||||
// that started one page earlier, so walk back a page and unmap from there.
|
// that started one page earlier, so walk back a page and unmap from there.
|
||||||
munmap(handler._data.sub(page_size()), SIGSTKSZ + page_size());
|
munmap(data.sub(page_size()), SIGSTKSZ + page_size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,5 +220,5 @@ mod imp {
|
||||||
super::Handler::null()
|
super::Handler::null()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn drop_handler(_handler: &mut super::Handler) {}
|
pub unsafe fn drop_handler(_data: *mut libc::c_void) {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,6 @@ fn main() {
|
||||||
println!("{:#?}", output);
|
println!("{:#?}", output);
|
||||||
let stderr = std::str::from_utf8(&output.stderr);
|
let stderr = std::str::from_utf8(&output.stderr);
|
||||||
assert!(stderr.map(|v| {
|
assert!(stderr.map(|v| {
|
||||||
v.ends_with("drop of the panic payload panicked")
|
v.ends_with("fatal runtime error: drop of the panic payload panicked\n")
|
||||||
}).unwrap_or(false));
|
}).unwrap_or(false));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue