#![no_std] #![forbid(unsafe_op_in_unsafe_fn)] extern crate alloc; // tier 1: linux, windows, wasm w/o atomics // tier 2: mac os, android, ios, fuschia, illumos, freebsd, netbsd, solaris, redox, uefi, zkvm, embedded // not supported: dragonfly, wasm w/ atomics, hermit, teeos, sgx, solid, xous cfg_if::cfg_if! { if #[cfg(any( all(target_os = "windows", not(target_vendor = "win7")), target_os = "linux", target_os = "android", //target_os = "freebsd", //target_os = "openbsd", //target_os = "dragonfly", //all(target_family = "wasm", target_feature = "atomics"), //target_os = "hermit", ))] { mod futex; } else if #[cfg(any( target_os = "dragonfly", all(target_family = "wasm", target_feature = "atomics"), target_os = "hermit" ))] { // merge with above when implemented //} else if #[cfg(target_os = "fuchsia")] { // mod fuchsia; // mod unix; } else if #[cfg(any( target_family = "unix", ))] { extern crate alloc; mod lazy_box; mod pthread; //mod queue; } else if #[cfg(target_os = "teeos")] { extern crate alloc; mod lazy_box; mod pthread; //mod teeos; } else if #[cfg(all(target_os = "windows", target_vendor = "win7"))] { mod windows7; //mod queue; } else if #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))] { //mod sgx; //mod queue; } else if #[cfg(target_os = "solid_asp3")] { //mod itron; //mod solid; } else if #[cfg(target_os = "xous")] { //mod xous; //mod queue; } else if #[cfg(any( target_family = "wasm", target_os = "uefi", target_os = "zkvm" ))] { mod no_threads; } else if #[cfg(target_has_atomic = "8")] { mod spin; } } cfg_if::cfg_if! { if #[cfg(any( all(target_os = "windows", not(target_vendor = "win7")), target_os = "linux", target_os = "android", //target_os = "freebsd", //target_os = "openbsd", //target_os = "dragonfly", //all(target_family = "wasm", target_feature = "atomics"), //target_os = "hermit", ))] { pub use futex::Mutex; } else if #[cfg(any( target_os = "dragonfly", all(target_family = "wasm", target_feature = "atomics"), target_os = "hermit" ))] { // merge with above when implemented //} else if #[cfg(target_os = "fuchsia")] { // mod fuchsia; // pub use fuchsia::Mutex; } else if #[cfg(any( target_family = "unix", //target_os = "teeos", ))] { pub use pthread::Mutex; } else if #[cfg(target_os = "teeos")] { // merge with above when implemented } else if #[cfg(all(target_os = "windows", target_vendor = "win7"))] { pub use windows7::Mutex; } else if #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))] { //pub use sgx::Mutex; } else if #[cfg(target_os = "solid_asp3")] { //pub use itron::Mutex; } else if #[cfg(target_os = "xous")] { //pub use xous::Mutex; } else if #[cfg(any( target_family = "wasm", target_os = "uefi", target_os = "zkvm" ))] { pub use no_threads::Mutex; } else if #[cfg(all(target_os = "none", target_has_atomic = "8"))] { pub use spin::Mutex; } } cfg_if::cfg_if! { if #[cfg(any( all(target_os = "windows", not(target_vendor = "win7")), target_os = "linux", target_os = "android", //target_os = "freebsd", //target_os = "openbsd", //target_os = "dragonfly", //target_os = "fuchsia", //all(target_family = "wasm", target_feature = "atomics"), //target_os = "hermit", ))] { pub use futex::RwLock; } else if #[cfg(any( all(target_family = "wasm", target_feature = "atomics"), target_os = "hermit" ))] { // merge with above when implemented } else if #[cfg(any( target_family = "unix", all(target_os = "windows", target_vendor = "win7"), //all(target_vendor = "fortanix", target_env = "sgx"), //target_os = "xous", ))] { //pub use queue::RwLock; } else if #[cfg(any( all(target_vendor = "fortanix", target_env = "sgx"), target_os = "xous",) )] { // merge with above when implemented } else if #[cfg(target_os = "solid_asp3")] { //pub use solid::RwLock; } else if #[cfg(target_os = "teeos")] { //pub use teeos::RwLock; } else if #[cfg(any( target_family = "wasm", target_os = "uefi", target_os = "zkvm" ))] { pub use no_threads::RwLock; } else if #[cfg(all(target_os = "none", target_has_atomic = "8"))] { //pub use spin::RwLock; } } unsafe impl lock_api::RawMutex for Mutex { #[allow(clippy::declare_interior_mutable_const)] const INIT: Self = Self::new(); type GuardMarker = lock_api::GuardNoSend; #[no_panic::no_panic] fn lock(&self) { // safety: unsafe_lock is disabled unsafe { self.lock() } } #[no_panic::no_panic] fn try_lock(&self) -> bool { unsafe { self.try_lock() } } #[no_panic::no_panic] unsafe fn unlock(&self) { unsafe { self.unlock() } } fn is_locked(&self) -> bool { unsafe { self.is_locked() } } }