use starina_types::error::FtlError;
use starina_types::handle::HandleId;
use starina_types::poll::PollEvent;
use crate::handle::OwnedHandle;
use crate::syscall;
pub struct Poll {
handle: OwnedHandle,
}
impl Poll {
pub fn new() -> Result<Poll, FtlError> {
let handle = syscall::poll_create()?;
Ok(Poll {
handle: OwnedHandle::from_raw(handle),
})
}
pub fn from_handle(handle: OwnedHandle) -> Poll {
Poll { handle }
}
pub fn add(&self, handle: HandleId, interests: PollEvent) -> Result<(), FtlError> {
syscall::poll_add(self.handle.id(), handle, interests)
}
pub fn remove(&self, pollee: HandleId) -> Result<(), FtlError> {
syscall::poll_remove(self.handle.id(), pollee)
}
pub fn wait(&self) -> Result<(PollEvent, HandleId), FtlError> {
let ret = syscall::poll_wait(self.handle.id())?;
Ok((ret.event(), ret.handle()))
}
}