obkrnl/lock/gutex/
guard.rs1use super::GroupGuard;
2use core::fmt::{Display, Formatter};
3use core::ops::{Deref, DerefMut};
4
5pub struct GutexRead<'a, T> {
7 #[allow(dead_code)] lock: GroupGuard<'a>,
9 active: *mut usize,
10 value: *const T,
11}
12
13impl<'a, T> GutexRead<'a, T> {
14 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
47pub struct GutexWrite<'a, T> {
49 #[allow(dead_code)] lock: GroupGuard<'a>,
51 active: *mut usize,
52 value: *mut T,
53}
54
55impl<'a, T> GutexWrite<'a, T> {
56 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> {}