use std::{
io,
os::fd::{AsRawFd, FromRawFd, OwnedFd},
};
use arrayvec::ArrayVec;
use crate::{buf::BufWrapperMut, impl_raw_fd, op::Recv, syscall, task::RUNTIME};
#[derive(Debug)]
pub struct Event {
fd: OwnedFd,
}
impl Event {
pub fn new() -> io::Result<Self> {
let fd = syscall!(eventfd(0, 0))?;
let fd = unsafe { OwnedFd::from_raw_fd(fd) };
Ok(Self { fd })
}
pub fn handle(&self) -> io::Result<EventHandle> {
Ok(EventHandle::new(self.fd.try_clone()?))
}
pub async fn wait(&self) -> io::Result<()> {
let buffer = ArrayVec::<u8, 8>::new();
let op = Recv::new(self.as_raw_fd(), BufWrapperMut::from(buffer));
let (res, _) = RUNTIME.with(|runtime| runtime.submit(op)).await;
res?;
Ok(())
}
}
impl_raw_fd!(Event, fd);
pub struct EventHandle {
fd: OwnedFd,
}
impl EventHandle {
pub(crate) fn new(fd: OwnedFd) -> Self {
Self { fd }
}
pub fn notify(&mut self) -> io::Result<()> {
let data = 1u64;
syscall!(write(
self.fd.as_raw_fd(),
&data as *const _ as *const _,
std::mem::size_of::<u64>(),
))?;
Ok(())
}
}
impl_raw_fd!(EventHandle, fd);