Skip to main content

parking_lot/
raw_fair_mutex.rs

1use crate::raw_mutex::RawMutex;
2use lock_api::RawMutexFair;
3
4/// Raw fair mutex type backed by the parking lot.
5pub struct RawFairMutex(RawMutex);
6
7unsafe impl lock_api::RawMutex for RawFairMutex {
8    const INIT: Self = RawFairMutex(<RawMutex as lock_api::RawMutex>::INIT);
9
10    type Guard = <RawMutex as lock_api::RawMutex>::Guard;
11
12    #[inline]
13    fn lock(&self) -> Self::Guard {
14        self.0.lock()
15    }
16
17    #[inline]
18    fn try_lock(&self) -> Option<Self::Guard> {
19        self.0.try_lock()
20    }
21
22    #[inline]
23    unsafe fn unlock(&self, guard: Self::Guard) {
24        unsafe { self.unlock_fair(guard) }
25    }
26
27    #[inline]
28    fn is_locked(&self) -> bool {
29        self.0.is_locked()
30    }
31}
32
33unsafe impl lock_api::RawMutexFair for RawFairMutex {
34    #[inline]
35    unsafe fn unlock_fair(&self, guard: Self::Guard) {
36        unsafe { self.0.unlock_fair(guard) }
37    }
38
39    #[inline]
40    unsafe fn bump(&self, guard: &mut Self::Guard) {
41        unsafe { self.0.bump(guard) }
42    }
43}
44
45unsafe impl lock_api::RawMutexTimed for RawFairMutex {
46    type Duration = <RawMutex as lock_api::RawMutexTimed>::Duration;
47    type Instant = <RawMutex as lock_api::RawMutexTimed>::Instant;
48
49    #[inline]
50    fn try_lock_until(&self, timeout: Self::Instant) -> Option<Self::Guard> {
51        self.0.try_lock_until(timeout)
52    }
53
54    #[inline]
55    fn try_lock_for(&self, timeout: Self::Duration) -> Option<Self::Guard> {
56        self.0.try_lock_for(timeout)
57    }
58}