obkrnl/lock/gutex/
guard.rs1use super::GroupGuard;
2use core::fmt::{Display, Formatter};
3use core::ops::{Deref, DerefMut};
4
5pub struct GutexWrite<'a, T> {
7 #[allow(dead_code)] lock: GroupGuard<'a>,
9 active: *mut usize,
10 value: *mut T,
11}
12
13impl<'a, T> GutexWrite<'a, T> {
14 pub(super) unsafe fn new(lock: GroupGuard<'a>, active: *mut usize, value: *mut T) -> Self {
17 Self {
18 active,
19 value,
20 lock,
21 }
22 }
23}
24
25impl<T> Drop for GutexWrite<'_, T> {
26 fn drop(&mut self) {
27 unsafe { *self.active = 0 };
28 }
29}
30
31impl<T> Deref for GutexWrite<'_, T> {
32 type Target = T;
33
34 fn deref(&self) -> &Self::Target {
35 unsafe { &*self.value }
36 }
37}
38
39impl<T> DerefMut for GutexWrite<'_, T> {
40 fn deref_mut(&mut self) -> &mut Self::Target {
41 unsafe { &mut *self.value }
42 }
43}
44
45impl<T: Display> Display for GutexWrite<'_, T> {
46 fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
47 self.deref().fmt(f)
48 }
49}
50
51unsafe impl<T: Sync> Sync for GutexWrite<'_, T> {}