use sc::syscall;
use crate::platform::{PollFd, SigSetT, TimeSpec};
pub fn ppoll(
poll_fds: &mut [PollFd],
timespec: Option<&TimeSpec>,
sigset: Option<&SigSetT>,
) -> crate::Result<usize> {
let res = unsafe {
syscall!(
PPOLL,
poll_fds.as_mut_ptr(),
poll_fds.len(),
timespec.map_or_else(core::ptr::null, core::ptr::from_ref::<TimeSpec>),
sigset.map_or_else(core::ptr::null, core::ptr::from_ref::<SigSetT>)
)
};
bail_on_below_zero!(res, "`PPOLL` syscall failed");
Ok(res)
}
#[cfg(test)]
mod tests {
use crate::platform::{PollEvents, PollFd, TimeSpec, STDOUT};
use crate::select::ppoll;
#[test]
fn poll_stdout_ready() {
let mut poll_fds = [PollFd::new(STDOUT, PollEvents::POLLOUT)];
println!("Dummy out");
let num_rdy = ppoll(&mut poll_fds, Some(&TimeSpec::new(1, 0)), None).unwrap();
assert_eq!(1, num_rdy);
assert_ne!(
PollEvents::empty(),
poll_fds[0].received_events() & PollEvents::POLLOUT
);
}
}