1 use crate::sys::locks as imp;
3 /// An OS-based mutual exclusion lock, meant for use in static variables.
5 /// This mutex has a const constructor ([`StaticMutex::new`]), does not
6 /// implement `Drop` to cleanup resources, and causes UB when used reentrantly.
8 /// This mutex does not implement poisoning.
10 /// This is a wrapper around `imp::Mutex` that does *not* call `init()` and
12 pub struct StaticMutex(imp::Mutex);
14 unsafe impl Sync for StaticMutex {}
17 /// Creates a new mutex for use.
18 pub const fn new() -> Self {
19 Self(imp::Mutex::new())
22 /// Calls raw_lock() and then returns an RAII guard to guarantee the mutex
25 /// It is undefined behaviour to call this function while locked by the
28 pub unsafe fn lock(&'static self) -> StaticMutexGuard {
30 StaticMutexGuard(&self.0)
35 pub struct StaticMutexGuard(&'static imp::Mutex);
37 impl Drop for StaticMutexGuard {
46 /// An OS-based mutual exclusion lock.
48 /// This mutex does *not* have a const constructor, cleans up its resources in
49 /// its `Drop` implementation, may safely be moved (when not borrowed), and
50 /// does not cause UB when used reentrantly.
52 /// This mutex does not implement poisoning.
54 /// This is either a wrapper around `Box<imp::Mutex>` or `imp::Mutex`,
55 /// depending on the platform. It is boxed on platforms where `imp::Mutex` may
57 pub struct MovableMutex(imp::MovableMutex);
59 unsafe impl Sync for MovableMutex {}
62 /// Creates a new mutex.
63 pub fn new() -> Self {
64 let mut mutex = imp::MovableMutex::from(imp::Mutex::new());
65 unsafe { mutex.init() };
69 pub(super) fn raw(&self) -> &imp::Mutex {
73 /// Locks the mutex blocking the current thread until it is available.
75 pub fn raw_lock(&self) {
76 unsafe { self.0.lock() }
79 /// Attempts to lock the mutex without blocking, returning whether it was
80 /// successfully acquired or not.
82 pub fn try_lock(&self) -> bool {
83 unsafe { self.0.try_lock() }
86 /// Unlocks the mutex.
88 /// Behavior is undefined if the current thread does not actually hold the
91 pub unsafe fn raw_unlock(&self) {
96 impl Drop for MovableMutex {
98 unsafe { self.0.destroy() };