#![doc = include_str!("../README.md")]
#![no_std]
#[cfg(feature = "std")]
extern crate std;
mod macros;
pub use macros::features;
#[doc(hidden)]
#[allow(unused)]
pub mod __support {
pub use crate::macros::__support::dtor_parse_impl as dtor_parse;
pub use crate::macros::__support::*;
pub use crate::native::*;
}
#[doc(inline)]
#[cfg(feature = "proc_macro")]
pub use dtor_proc_macro::dtor;
#[doc(hidden)]
#[cfg(feature = "proc_macro")]
pub use dtor_proc_macro::__dtor_from_ctor;
pub mod declarative {
#[doc(inline)]
pub use crate::__support::dtor_parse_impl as dtor;
}
#[cfg(feature = "export_native")]
pub use native::*;
mod native {
#![allow(unsafe_code, unused_unsafe, unknown_lints)]
#[inline(always)]
pub unsafe fn at_binary_exit(cb: extern "C" fn()) {
unsafe {
_run_atexit(cb);
}
}
#[cfg(any(feature = "cxa_atexit", target_vendor = "apple"))]
#[inline(always)]
pub unsafe fn at_library_exit(cb: extern "C" fn()) {
unsafe {
_run_cxa_atexit(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), any(feature = "cxa_atexit", target_vendor = "apple")))]
#[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()) {
}
}