27 lines
789 B
Rust
27 lines
789 B
Rust
#![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);
|
|
}
|
|
}
|