1#![allow(unsafe_code, unused_unsafe, unknown_lints)]
2
3#[inline(always)]
16#[cfg(not(windows))]
17pub unsafe fn at_binary_exit(cb: extern "C" fn()) {
18 unsafe {
19 _run_atexit(cb);
20 }
21}
22
23#[inline(always)]
35pub unsafe fn at_module_exit(cb: extern "C" fn()) {
36 unsafe {
37 #[cfg(all(not(windows), not(target_family = "wasm")))]
38 _run_cxa_atexit(cb);
39 #[cfg(any(windows, target_family = "wasm"))]
40 _run_atexit(cb);
41 }
42}
43
44#[doc(hidden)]
46#[deprecated(since = "0.11.0", note = "Use `at_module_exit` instead")]
47#[inline(always)]
48pub unsafe fn at_library_exit(cb: extern "C" fn()) {
49 unsafe {
50 at_module_exit(cb);
51 }
52}
53
54#[cfg(all(not(miri), not(target_family = "wasm")))]
56#[inline(always)]
57unsafe fn _run_atexit(cb: unsafe extern "C" fn()) {
58 #[allow(missing_unsafe_on_extern)] extern "C" {
60 fn atexit(cb: unsafe extern "C" fn());
61 }
62 unsafe {
63 atexit(cb);
64 }
65}
66
67#[cfg(all(not(miri), target_family = "wasm"))]
68#[inline(always)]
69unsafe fn _run_atexit(cb: unsafe extern "C" fn()) {
70 #[allow(missing_unsafe_on_extern)] #[cfg_attr(target_os = "unknown", link(wasm_import_module = "env"))]
72 extern "C" {
73 fn atexit(cb: unsafe extern "C" fn()) -> i32;
74 }
75 unsafe {
76 atexit(cb);
77 }
78}
79
80#[cfg(all(not(miri), not(windows), not(target_family = "wasm")))]
82#[inline(always)]
83unsafe fn _run_cxa_atexit(cb: extern "C" fn()) {
84 #[allow(missing_unsafe_on_extern)] extern "C" {
86 static __dso_handle: *const u8;
87 fn __cxa_atexit(
88 cb: extern "C" fn(_: *const u8),
89 arg: *const u8,
90 dso_handle: *const u8,
91 );
92 }
93 extern "C" fn exit_fn(fn_ptr: *const u8) {
94 let f: fn() = unsafe { ::core::mem::transmute(fn_ptr) };
95 f()
96 }
97 unsafe {
98 __cxa_atexit(exit_fn, cb as _, __dso_handle);
99 }
100}
101
102#[cfg(miri)]
103#[inline(always)]
104unsafe fn _run_atexit(_cb: extern "C" fn()) {
105 }
107
108#[cfg(miri)]
109#[inline(always)]
110unsafe fn _run_cxa_atexit(_cb: extern "C" fn()) {
111 }