    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    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<T> {
        /// inner data
        inner: RefCell<T>,
    }

    unsafe impl<T> Sync for UPSafeCell<T> {}

    impl<T> UPSafeCell<T> {
        /// 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),
            }
        }
        /// Panic if the data has been borrowed.
        pub fn exclusive_access(&self) -> RefMut<'_, T> {
            self.inner.borrow_mut()
        }
    }