use std::os::fd::{AsRawFd, BorrowedFd};
use aya::maps::{MapData, RingBuf};
use nix::poll::PollFlags;
use crate::{channels::ChannelError, events::copy::CopyEvent};
pub struct Receiver {
pub(crate) ring_buf: RingBuf<MapData>,
}
impl From<RingBuf<MapData>> for Receiver {
fn from(value: RingBuf<MapData>) -> Self {
Self { ring_buf: value }
}
}
impl Receiver {
pub fn try_recv(&mut self) -> Result<CopyEvent<'_>, ChannelError> {
self.ring_buf
.next()
.map(std::convert::Into::into)
.ok_or(ChannelError::Empty)
}
pub fn recv(&mut self) -> Result<CopyEvent<'_>, ChannelError> {
let ptr = &raw mut self.ring_buf;
loop {
if let Some(item) = unsafe { (*ptr).next() } {
return Ok(item.into());
}
let borrowed_fd = unsafe { BorrowedFd::borrow_raw(self.ring_buf.as_raw_fd()) };
crate::channels::poll::poll_fd(borrowed_fd, PollFlags::POLLIN)?;
}
}
}