diff options
| author | Mica White <botahamec@outlook.com> | 2025-12-08 20:14:03 -0500 |
|---|---|---|
| committer | Mica White <botahamec@outlook.com> | 2025-12-08 20:14:03 -0500 |
| commit | c31f4ce84c3c8b3f89a05890df775d4e766aaadb (patch) | |
| tree | 40169c1240717002197c85985f9bb652dd4b0af8 /src/lib.rs | |
Diffstat (limited to 'src/lib.rs')
| -rwxr-xr-x | src/lib.rs | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100755 index 0000000..b26d0b1 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,187 @@ +#![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() } + } +} |
