summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rwxr-xr-xsrc/lib.rs187
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() }
+ }
+}