mirror of
https://github.com/mlua-rs/mlua
synced 2026-06-08 16:05:43 +00:00
Refactor userdata-wrappers feature.
Support borrowing underlying data in `UserDataRef` and `UserDataRefMut`.
This commit is contained in:
@@ -7,6 +7,45 @@ pub(crate) trait UserDataLock {
|
||||
|
||||
unsafe fn unlock_shared(&self);
|
||||
unsafe fn unlock_exclusive(&self);
|
||||
|
||||
fn try_lock_shared_guarded(&self) -> Result<LockGuard<'_, Self>, ()> {
|
||||
if self.try_lock_shared() {
|
||||
Ok(LockGuard {
|
||||
lock: self,
|
||||
exclusive: false,
|
||||
})
|
||||
} else {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
|
||||
fn try_lock_exclusive_guarded(&self) -> Result<LockGuard<'_, Self>, ()> {
|
||||
if self.try_lock_exclusive() {
|
||||
Ok(LockGuard {
|
||||
lock: self,
|
||||
exclusive: true,
|
||||
})
|
||||
} else {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct LockGuard<'a, L: UserDataLock + ?Sized> {
|
||||
lock: &'a L,
|
||||
exclusive: bool,
|
||||
}
|
||||
|
||||
impl<L: UserDataLock + ?Sized> Drop for LockGuard<'_, L> {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
if self.exclusive {
|
||||
self.lock.unlock_exclusive();
|
||||
} else {
|
||||
self.lock.unlock_shared();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) use lock_impl::RawLock;
|
||||
|
||||
Reference in New Issue
Block a user