obkrnl/lock/gutex/
guard.rs

1use super::GroupGuard;
2use core::fmt::{Display, Formatter};
3use core::ops::{Deref, DerefMut};
4
5/// RAII structure used to release the shared read access of a lock when dropped.
6pub struct GutexRead<'a, T> {
7    #[allow(dead_code)] // active and value fields is protected by this lock.
8    lock: GroupGuard<'a>,
9    active: *mut usize,
10    value: *const T,
11}
12
13impl<'a, T> GutexRead<'a, T> {
14    /// # Safety
15    /// `active` and `value` must be protected by `lock`.
16    pub(super) fn new(lock: GroupGuard<'a>, active: *mut usize, value: *const T) -> Self {
17        Self {
18            lock,
19            active,
20            value,
21        }
22    }
23}
24
25impl<T> Drop for GutexRead<'_, T> {
26    fn drop(&mut self) {
27        unsafe { *self.active -= 1 };
28    }
29}
30
31impl<T> Deref for GutexRead<'_, T> {
32    type Target = T;
33
34    fn deref(&self) -> &Self::Target {
35        unsafe { &*self.value }
36    }
37}
38
39impl<T: Display> Display for GutexRead<'_, T> {
40    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
41        self.deref().fmt(f)
42    }
43}
44
45unsafe impl<T: Sync> Sync for GutexRead<'_, T> {}
46
47/// RAII structure used to release the exclusive write access of a lock when dropped.
48pub struct GutexWrite<'a, T> {
49    #[allow(dead_code)] // active and value fields is protected by this lock.
50    lock: GroupGuard<'a>,
51    active: *mut usize,
52    value: *mut T,
53}
54
55impl<'a, T> GutexWrite<'a, T> {
56    /// # Safety
57    /// `active` and `value` must be protected by `lock`.
58    pub(super) unsafe fn new(lock: GroupGuard<'a>, active: *mut usize, value: *mut T) -> Self {
59        Self {
60            active,
61            value,
62            lock,
63        }
64    }
65}
66
67impl<T> Drop for GutexWrite<'_, T> {
68    fn drop(&mut self) {
69        unsafe { *self.active = 0 };
70    }
71}
72
73impl<T> Deref for GutexWrite<'_, T> {
74    type Target = T;
75
76    fn deref(&self) -> &Self::Target {
77        unsafe { &*self.value }
78    }
79}
80
81impl<T> DerefMut for GutexWrite<'_, T> {
82    fn deref_mut(&mut self) -> &mut Self::Target {
83        unsafe { &mut *self.value }
84    }
85}
86
87impl<T: Display> Display for GutexWrite<'_, T> {
88    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
89        self.deref().fmt(f)
90    }
91}
92
93unsafe impl<T: Sync> Sync for GutexWrite<'_, T> {}