use std::io;
use std::sync::atomic::Ordering;
use super::sys::{Selector, SysEvent};
use crate::scheduler::WORKER_ID;
pub struct EventLoop {
selector: Selector,
}
impl EventLoop {
pub fn new(io_workers: usize) -> io::Result<EventLoop> {
Selector::new(io_workers).map(|selector| EventLoop { selector })
}
pub fn run(&self, id: usize) -> io::Result<()> {
use std::mem::MaybeUninit;
#[cfg(nightly)]
WORKER_ID.store(id, Ordering::Relaxed);
#[cfg(not(nightly))]
WORKER_ID.with(|worker_id| worker_id.store(id, Ordering::Relaxed));
let events_buf: MaybeUninit<[SysEvent; 1024]> = MaybeUninit::uninit();
let mut events_buf = unsafe { events_buf.assume_init() };
let mut next_expire = Some(1_000_000_000);
loop {
next_expire = match self.selector.select(id, &mut events_buf, next_expire) {
Ok(v) => v.or(Some(1_000_000_000)),
Err(e) => {
error!("selector error={:?}", e);
continue;
}
}
}
}
#[inline]
pub fn get_selector(&self) -> &Selector {
&self.selector
}
}