pub use libxev_sys as sys;
mod threadpool;
pub use threadpool::{Batch, Config as ThreadPoolConfig, Task, ThreadPool};
mod watcher;
pub use watcher::{Async, CbAction, Completion, CompletionRef, CompletionState, LoopRef, Timer};
#[cfg(feature = "extended-api")]
pub mod extensions;
use std::io;
use std::mem::MaybeUninit;
pub struct Loop {
raw: Box<sys::xev_loop>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RunMode {
NoWait,
Once,
UntilDone,
}
impl RunMode {
fn to_raw(self) -> sys::xev_run_mode_t {
match self {
RunMode::NoWait => sys::xev_run_mode_t_XEV_RUN_NO_WAIT,
RunMode::Once => sys::xev_run_mode_t_XEV_RUN_ONCE,
RunMode::UntilDone => sys::xev_run_mode_t_XEV_RUN_UNTIL_DONE,
}
}
}
impl Loop {
pub fn new() -> io::Result<Self> {
let mut raw: Box<MaybeUninit<sys::xev_loop>> = Box::new(MaybeUninit::zeroed());
let rc = unsafe { sys::xev_loop_init(raw.as_mut_ptr()) };
if rc != 0 {
return Err(io::Error::from_raw_os_error(rc));
}
let raw: Box<sys::xev_loop> = unsafe { Box::from_raw(Box::into_raw(raw).cast()) };
Ok(Self { raw })
}
pub fn run(&mut self, mode: RunMode) -> io::Result<()> {
let rc = unsafe { sys::xev_loop_run(&mut *self.raw, mode.to_raw()) };
if rc != 0 {
return Err(io::Error::from_raw_os_error(rc));
}
Ok(())
}
pub fn now(&mut self) -> i64 {
unsafe { sys::xev_loop_now(&mut *self.raw) }
}
pub fn update_now(&mut self) {
unsafe { sys::xev_loop_update_now(&mut *self.raw) };
}
pub fn as_raw(&mut self) -> *mut sys::xev_loop {
&mut *self.raw
}
}
impl Drop for Loop {
fn drop(&mut self) {
unsafe { sys::xev_loop_deinit(&mut *self.raw) };
}
}