about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--library/std/src/sys/thread_local/key/unix.rs20
-rw-r--r--library/std/src/sys/thread_local/mod.rs5
2 files changed, 24 insertions, 1 deletions
diff --git a/library/std/src/sys/thread_local/key/unix.rs b/library/std/src/sys/thread_local/key/unix.rs
index 28e48a750b9..b4b58b34706 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(all(target_os = "wasi", target_env = "p1", target_feature = "atomics"))]
+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 31d3b439060..f0a13323ec9 100644
--- a/library/std/src/sys/thread_local/mod.rs
+++ b/library/std/src/sys/thread_local/mod.rs
@@ -86,7 +86,9 @@ pub(crate) mod guard {
             mod windows;
             pub(crate) use windows::enable;
         } else if #[cfg(any(
-            target_family = "wasm",
+            all(target_family = "wasm", not(
+                all(target_os = "wasi", target_env = "p1", target_feature = "atomics")
+            )),
             target_os = "uefi",
             target_os = "zkvm",
         ))] {
@@ -135,6 +137,7 @@ pub(crate) mod key {
                 target_family = "unix",
             ),
             target_os = "teeos",
+            all(target_os = "wasi", target_env = "p1", target_feature = "atomics"),
         ))] {
             mod racy;
             mod unix;