diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs index 1974a8fd26..1da1a154fa 100644 --- a/src/header/stdlib/mod.rs +++ b/src/header/stdlib/mod.rs @@ -50,6 +50,7 @@ pub const MB_CUR_MAX: c_int = 4; pub const MB_LEN_MAX: c_int = 4; static mut ATEXIT_FUNCS: [Option; 32] = [None; 32]; +static mut AT_QUICK_EXIT_FUNCS: [Option; 32] = [None; 32]; static mut L64A_BUFFER: [c_char; 7] = [0; 7]; // up to 6 digits plus null terminator static mut RNG: Option = None; @@ -144,9 +145,16 @@ pub unsafe extern "C" fn aligned_alloc(alignment: size_t, size: size_t) -> *mut } /// See . -// #[no_mangle] +#[no_mangle] pub unsafe extern "C" fn at_quick_exit(func: Option) -> c_int { - unimplemented!(); + for i in 0..AT_QUICK_EXIT_FUNCS.len() { + if AT_QUICK_EXIT_FUNCS[i] == None { + AT_QUICK_EXIT_FUNCS[i] = func; + return 0; + } + } + + 1 } /// See . @@ -1040,9 +1048,15 @@ pub unsafe extern "C" fn qsort_r( } /// See . -// #[no_mangle] +#[no_mangle] pub unsafe extern "C" fn quick_exit(status: c_int) -> ! { - unimplemented!(); + for i in (0..AT_QUICK_EXIT_FUNCS.len()).rev() { + if let Some(func) = AT_QUICK_EXIT_FUNCS[i] { + (func)(); + } + } + + Sys::exit(status); } /// See .