about summary refs log tree commit diff
path: root/library/std/src/sys
diff options
context:
space:
mode:
authorSebastian Urban <surban@surban.net>2024-12-03 16:16:08 +0100
committerSebastian Urban <surban@surban.net>2024-12-03 16:16:08 +0100
commit4fe15b06e8f3ea9ebcb916df2fd4b2f0e9537296 (patch)
treefbe9da3b835d5854363c9ad5dfa89ae19807c158 /library/std/src/sys
parentec5f41a9531947cd87d7daca124e2e7b55f23b35 (diff)
downloadrust-4fe15b06e8f3ea9ebcb916df2fd4b2f0e9537296.tar.gz
rust-4fe15b06e8f3ea9ebcb916df2fd4b2f0e9537296.zip
Use UNIX thread_local implementation for WASI.
Diffstat (limited to 'library/std/src/sys')
-rw-r--r--library/std/src/sys/thread_local/guard/wasi.rs71
-rw-r--r--library/std/src/sys/thread_local/key/unix.rs20
-rw-r--r--library/std/src/sys/thread_local/mod.rs6
3 files changed, 22 insertions, 75 deletions
diff --git a/library/std/src/sys/thread_local/guard/wasi.rs b/library/std/src/sys/thread_local/guard/wasi.rs
deleted file mode 100644
index dfd1f126aa0..00000000000
--- a/library/std/src/sys/thread_local/guard/wasi.rs
+++ /dev/null
@@ -1,71 +0,0 @@
-//! wasm32-wasip1 has pthreads support.
-
-use crate::cell::Cell;
-use crate::sync::atomic::{AtomicBool, Ordering};
-use crate::sys::thread_local::destructors;
-use crate::{ffi, ptr};
-
-// Add a few symbols not in upstream `libc` just yet.
-mod libc {
-    pub use libc::*;
-
-    use crate::ffi;
-
-    #[allow(non_camel_case_types)]
-    pub type pthread_key_t = ffi::c_uint;
-
-    extern "C" {
-        pub fn pthread_key_create(
-            key: *mut pthread_key_t,
-            destructor: unsafe extern "C" fn(*mut ffi::c_void),
-        ) -> ffi::c_int;
-
-        pub fn pthread_setspecific(key: pthread_key_t, value: *const ffi::c_void) -> ffi::c_int;
-    }
-}
-
-pub fn enable() {
-    enable_main();
-    enable_thread();
-}
-
-fn enable_main() {
-    static REGISTERED: AtomicBool = AtomicBool::new(false);
-
-    if !REGISTERED.swap(true, Ordering::AcqRel) {
-        unsafe {
-            assert_eq!(libc::atexit(run_main_dtors), 0);
-        }
-    }
-
-    extern "C" fn run_main_dtors() {
-        unsafe {
-            destructors::run();
-            crate::rt::thread_cleanup();
-        }
-    }
-}
-
-fn enable_thread() {
-    #[thread_local]
-    static REGISTERED: Cell<bool> = Cell::new(false);
-
-    if !REGISTERED.replace(true) {
-        unsafe {
-            let mut key: libc::pthread_key_t = 0;
-            assert_eq!(libc::pthread_key_create(&mut key, run_thread_dtors), 0);
-
-            // We must set the value to a non-NULL pointer value so that
-            // the destructor is run on thread exit. The pointer is only
-            // passed to run_dtors and never dereferenced.
-            assert_eq!(libc::pthread_setspecific(key, ptr::without_provenance(1)), 0);
-        }
-    }
-
-    extern "C" fn run_thread_dtors(_: *mut ffi::c_void) {
-        unsafe {
-            destructors::run();
-            crate::rt::thread_cleanup();
-        }
-    }
-}
diff --git a/library/std/src/sys/thread_local/key/unix.rs b/library/std/src/sys/thread_local/key/unix.rs
index 28e48a750b9..6661e378dbf 100644
--- a/library/std/src/sys/thread_local/key/unix.rs
+++ b/library/std/src/sys/thread_local/key/unix.rs
@@ -1,5 +1,25 @@
 use crate::mem;
 
+// For WASI add a few symbols not in upstream `libc` just yet.
+#[cfg(target_os = "wasi")]
+mod libc {
+    use crate::ffi;
+
+    #[allow(non_camel_case_types)]
+    pub type pthread_key_t = ffi::c_uint;
+
+    extern "C" {
+        pub fn pthread_key_create(
+            key: *mut pthread_key_t,
+            destructor: unsafe extern "C" fn(*mut ffi::c_void),
+        ) -> ffi::c_int;
+        #[allow(dead_code)]
+        pub fn pthread_getspecific(key: pthread_key_t) -> *mut ffi::c_void;
+        pub fn pthread_setspecific(key: pthread_key_t, value: *const ffi::c_void) -> ffi::c_int;
+        pub fn pthread_key_delete(key: pthread_key_t) -> ffi::c_int;
+    }
+}
+
 pub type Key = libc::pthread_key_t;
 
 #[inline]
diff --git a/library/std/src/sys/thread_local/mod.rs b/library/std/src/sys/thread_local/mod.rs
index 042f0f76c9a..82e1aeabf5b 100644
--- a/library/std/src/sys/thread_local/mod.rs
+++ b/library/std/src/sys/thread_local/mod.rs
@@ -85,11 +85,8 @@ pub(crate) mod guard {
         } else if #[cfg(target_os = "windows")] {
             mod windows;
             pub(crate) use windows::enable;
-        } else if #[cfg(all(target_os = "wasi"))] {
-            mod wasi;
-            pub(crate) use wasi::enable;
         } else if #[cfg(any(
-            target_family = "wasm",
+            all(target_family = "wasm", not(target_os="wasi")),
             target_os = "uefi",
             target_os = "zkvm",
         ))] {
@@ -138,6 +135,7 @@ pub(crate) mod key {
                 target_family = "unix",
             ),
             target_os = "teeos",
+            target_os = "wasi",
         ))] {
             mod racy;
             mod unix;