summaryrefslogtreecommitdiffstats
path: root/library/std/src/sys/hermit/thread_local_dtor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/std/src/sys/hermit/thread_local_dtor.rs')
-rw-r--r--library/std/src/sys/hermit/thread_local_dtor.rs14
1 files changed, 8 insertions, 6 deletions
diff --git a/library/std/src/sys/hermit/thread_local_dtor.rs b/library/std/src/sys/hermit/thread_local_dtor.rs
index 613266b95..98adaf4bf 100644
--- a/library/std/src/sys/hermit/thread_local_dtor.rs
+++ b/library/std/src/sys/hermit/thread_local_dtor.rs
@@ -5,23 +5,25 @@
// The this solution works like the implementation of macOS and
// doesn't additional OS support
-use crate::mem;
+use crate::cell::RefCell;
#[thread_local]
-static mut DTORS: Vec<(*mut u8, unsafe extern "C" fn(*mut u8))> = Vec::new();
+static DTORS: RefCell<Vec<(*mut u8, unsafe extern "C" fn(*mut u8))>> = RefCell::new(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));
+ match DTORS.try_borrow_mut() {
+ Ok(mut dtors) => dtors.push((t, dtor)),
+ Err(_) => rtabort!("global allocator may not use TLS"),
+ }
}
// every thread call this function to run through all possible destructors
pub unsafe fn run_dtors() {
- let mut list = mem::take(&mut DTORS);
+ let mut list = DTORS.take();
while !list.is_empty() {
for (ptr, dtor) in list {
dtor(ptr);
}
- list = mem::take(&mut DTORS);
+ list = DTORS.take();
}
}