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(not(windows))]
38 _run_cxa_atexit(cb);
39 #[cfg(windows)]
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(not(miri))]
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), not(windows)))]
69#[inline(always)]
70unsafe fn _run_cxa_atexit(cb: extern "C" fn()) {
71 #[allow(missing_unsafe_on_extern)] extern "C" {
73 static __dso_handle: *const u8;
74 fn __cxa_atexit(
75 cb: extern "C" fn(_: *const u8),
76 arg: *const u8,
77 dso_handle: *const u8,
78 );
79 }
80 extern "C" fn exit_fn(fn_ptr: *const u8) {
81 let f: fn() = unsafe { ::core::mem::transmute(fn_ptr) };
82 f()
83 }
84 unsafe {
85 __cxa_atexit(exit_fn, cb as _, __dso_handle);
86 }
87}
88
89#[cfg(miri)]
90#[inline(always)]
91unsafe fn _run_atexit(_cb: extern "C" fn()) {
92 }
94
95#[cfg(miri)]
96#[inline(always)]
97unsafe fn _run_cxa_atexit(_cb: extern "C" fn()) {
98 }