#![allow(unsafe_code, unused_unsafe, unknown_lints)]
#[inline(always)]
#[cfg(not(windows))]
pub unsafe fn at_binary_exit(cb: extern "C" fn()) {
unsafe {
_run_atexit(cb);
}
}
#[inline(always)]
pub unsafe fn at_module_exit(cb: extern "C" fn()) {
unsafe {
#[cfg(not(windows))]
_run_cxa_atexit(cb);
#[cfg(windows)]
_run_atexit(cb);
}
}
#[doc(hidden)]
#[deprecated(since = "0.11.0", note = "Use `at_module_exit` instead")]
#[inline(always)]
pub unsafe fn at_library_exit(cb: extern "C" fn()) {
unsafe {
at_module_exit(cb);
}
}
#[cfg(not(miri))]
#[inline(always)]
unsafe fn _run_atexit(cb: unsafe extern "C" fn()) {
#[allow(missing_unsafe_on_extern)] extern "C" {
fn atexit(cb: unsafe extern "C" fn());
}
unsafe {
atexit(cb);
}
}
#[cfg(all(not(miri), not(windows)))]
#[inline(always)]
unsafe fn _run_cxa_atexit(cb: extern "C" fn()) {
#[allow(missing_unsafe_on_extern)] extern "C" {
static __dso_handle: *const u8;
fn __cxa_atexit(
cb: extern "C" fn(_: *const u8),
arg: *const u8,
dso_handle: *const u8,
);
}
extern "C" fn exit_fn(fn_ptr: *const u8) {
let f: fn() = unsafe { ::core::mem::transmute(fn_ptr) };
f()
}
unsafe {
__cxa_atexit(exit_fn, cb as _, __dso_handle);
}
}
#[cfg(miri)]
#[inline(always)]
unsafe fn _run_atexit(_cb: extern "C" fn()) {
}
#[cfg(miri)]
#[inline(always)]
unsafe fn _run_cxa_atexit(_cb: extern "C" fn()) {
}