#![cfg(target_thread_local)] #![unstable(feature = "thread_local_internals", issue = "none")] // Simplify dtor registration by using a list of destructors. // The this solution works like the implementation of macOS and // doesn't additional OS support use crate::mem; #[thread_local] static mut DTORS: Vec<(*mut u8, unsafe extern "C" fn(*mut u8))> = Vec::new(); pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) { let list = &mut DTORS; list.push((t, dtor)); } // every thread call this function to run through all possible destructors pub unsafe fn run_dtors() { let mut list = mem::take(&mut DTORS); while !list.is_empty() { for (ptr, dtor) in list { dtor(ptr); } list = mem::take(&mut DTORS); } }