| //! 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<bool> = 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(); | |
| } | |
| } | |
| } |