jay-compositor 1.15.0

The Jay compositor
use crate::utils::thread_id::ThreadId;
use std::fmt::Debug;
use std::fmt::Formatter;
use std::ops::Deref;
use std::rc::Rc;

pub struct SendSyncRc<T> {
    tid: ThreadId,
    v: Rc<T>,
}

impl<T> SendSyncRc<T> {
    pub fn new(tid: ThreadId, v: &Rc<T>) -> Self {
        assert!(tid.is_current());
        Self { tid, v: v.clone() }
    }
}

impl<T> Drop for SendSyncRc<T> {
    fn drop(&mut self) {
        assert!(self.tid.is_current());
    }
}

impl<T> Deref for SendSyncRc<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.v
    }
}

unsafe impl<T> Send for SendSyncRc<T> where T: Sync {}
unsafe impl<T> Sync for SendSyncRc<T> where T: Sync {}

impl<T> Debug for SendSyncRc<T>
where
    T: Debug,
{
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        self.deref().fmt(f)
    }
}