//! SOLID, just like macOS, has an API to register TLS destructors. But since //! it does not allow specifying an argument to that function, and will not run //! destructors for terminated tasks, we still keep our own list. use crate::cell::Cell; use crate::sys::pal::abi; use crate::sys::pal::itron::task; use crate::sys::thread_local::destructors; pub fn enable() { #[thread_local] static REGISTERED: Cell = Cell::new(false); if !REGISTERED.replace(true) { let tid = task::current_task_id_aborting(); // Register `tls_dtor` to make sure the TLS destructors are called // for tasks created by other means than `std::thread` unsafe { abi::SOLID_TLS_AddDestructor(tid as i32, tls_dtor) }; } unsafe extern "C" fn tls_dtor(_unused: *mut u8) { unsafe { destructors::run(); crate::rt::thread_cleanup(); } } }