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 exclusive write access of a lock when dropped.
6pub struct GutexWrite<'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: *mut T,
11}
12
13impl<'a, T> GutexWrite<'a, T> {
14    /// # Safety
15    /// `active` and `value` must be protected by `lock`.
16    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> {}