use crate::ffi::collections::NonNullConst;
use crate::ffi::sys::sync_handler::{SyncHandlerBinding, SyncHandlerInterface};
use crate::ffi::Bool;
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)]
pub struct SyncHandler<'a> {
handler: &'a SyncHandlerInterface,
}
pub trait SyncHandlerAPI<'a> {
type Handler;
fn to_interface(&self) -> NonNullConst<SyncHandlerInterface>;
unsafe fn from_interface(handler: NonNullConst<SyncHandlerInterface>) -> Self::Handler;
unsafe fn lock(&self);
unsafe fn try_lock(&self) -> bool;
unsafe fn unlock(&self);
}
impl SyncHandlerAPI<'_> for SyncHandler<'_> {
type Handler = Self;
#[inline]
fn to_interface(&self) -> NonNullConst<SyncHandlerInterface> {
NonNullConst::from(self.handler)
}
#[inline]
unsafe fn from_interface(handler: NonNullConst<SyncHandlerInterface>) -> Self::Handler {
Self {
handler: &*handler.as_ptr(),
}
}
#[inline]
unsafe fn lock(&self) {
self.handler.lock()
}
#[inline]
unsafe fn try_lock(&self) -> bool {
self.handler.try_lock() == Bool::True
}
#[inline]
unsafe fn unlock(&self) {
self.handler.unlock()
}
}