//! Uniprocessor interior mutability primitives use core::cell::{RefCell, RefMut}; /// Wrap a static data structure inside it so that we are /// able to access it without any `unsafe`. /// /// We should only use it in uniprocessor. /// /// In order to get mutable reference of inner data, call /// `exclusive_access`. pub struct UPSafeCell { /// inner data inner: RefCell, } unsafe impl Sync for UPSafeCell {} impl UPSafeCell { /// User is responsible to guarantee that inner struct is only used in /// uniprocessor. pub unsafe fn new(value: T) -> Self { Self { inner: RefCell::new(value), } } /// Exclusive access inner data in UPSafeCell. Panic if the data has been borrowed. pub fn exclusive_access(&self) -> RefMut<'_, T> { self.inner.borrow_mut() } }