use std::{cell::UnsafeCell, fmt, ptr, sync::Arc};
use libxdp_sys::{xsk_ring_cons, xsk_ring_prod};
pub(crate) struct XskRingCons(Arc<UnsafeCell<xsk_ring_cons>>);
impl XskRingCons {
pub(crate) fn handle(&self) -> XskRingConsHandle {
XskRingConsHandle(Arc::clone(&self.0))
}
pub(crate) fn as_ptr(&self) -> *mut xsk_ring_cons {
self.0.get()
}
pub(crate) fn is_ring_null(&self) -> bool {
unsafe { (*self.0.get()).ring.is_null() }
}
}
impl Default for XskRingCons {
#[allow(clippy::arc_with_non_send_sync)]
fn default() -> Self {
Self(Arc::new(UnsafeCell::new(xsk_ring_cons {
cached_prod: 0,
cached_cons: 0,
mask: 0,
size: 0,
producer: ptr::null_mut(),
consumer: ptr::null_mut(),
ring: ptr::null_mut(),
flags: ptr::null_mut(),
})))
}
}
impl fmt::Debug for XskRingCons {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let ring = unsafe { *self.0.get() };
f.debug_tuple("XskRingCons").field(&ring).finish()
}
}
unsafe impl Send for XskRingCons {}
pub(crate) struct XskRingConsHandle(Arc<UnsafeCell<xsk_ring_cons>>);
impl fmt::Debug for XskRingConsHandle {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("XskRingConsHandle")
.field(&self.0.get())
.finish()
}
}
unsafe impl Send for XskRingConsHandle {}
pub(crate) struct XskRingProd(Arc<UnsafeCell<xsk_ring_prod>>);
impl XskRingProd {
pub(crate) fn handle(&self) -> XskRingProdHandle {
XskRingProdHandle(Arc::clone(&self.0))
}
pub(crate) fn as_ptr(&self) -> *mut xsk_ring_prod {
self.0.get()
}
pub(crate) fn is_ring_null(&self) -> bool {
unsafe { (*self.0.get()).ring.is_null() }
}
}
impl Default for XskRingProd {
#[allow(clippy::arc_with_non_send_sync)]
fn default() -> Self {
Self(Arc::new(UnsafeCell::new(xsk_ring_prod {
cached_prod: 0,
cached_cons: 0,
mask: 0,
size: 0,
producer: ptr::null_mut(),
consumer: ptr::null_mut(),
ring: ptr::null_mut(),
flags: ptr::null_mut(),
})))
}
}
impl fmt::Debug for XskRingProd {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let ring = unsafe { *self.0.get() };
f.debug_tuple("XskRingProd").field(&ring).finish()
}
}
unsafe impl Send for XskRingProd {}
pub(crate) struct XskRingProdHandle(Arc<UnsafeCell<xsk_ring_prod>>);
impl fmt::Debug for XskRingProdHandle {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("XskRingProdHandle")
.field(&self.0.get())
.finish()
}
}
unsafe impl Send for XskRingProdHandle {}