use mio::{Events, Poll, Registry, Token};
use std::collections::HashMap;
use std::io;
use std::sync::{Arc, Mutex};
use std::task::Waker;
pub struct Reactor {
pub registry: Registry,
pub wakers: Arc<Mutex<HashMap<Token, Waker>>>,
}
impl Reactor {
pub fn new() -> std::io::Result<(Arc<Self>, Poll)> {
let poll = Poll::new()?;
let registry = poll.registry().try_clone()?;
let reactor = Arc::new(Self {
registry,
wakers: Arc::new(Mutex::new(HashMap::new())),
});
Ok((reactor, poll))
}
pub fn add_waker(&self, token: Token, waker: Waker) {
let mut wakers = self.wakers.lock().unwrap();
wakers.insert(token, waker);
}
}
pub fn run_reactor_loop(mut poll: Poll, wakers: Arc<Mutex<HashMap<Token, Waker>>>) {
let mut events = Events::with_capacity(1024);
loop {
if let Err(e) = poll.poll(&mut events, None) {
if e.kind() == io::ErrorKind::Interrupted {
continue;
}
panic!("Reactor poll error: {}", e);
}
for event in events.iter() {
let token = event.token();
let mut wakers_guard = wakers.lock().unwrap();
if let Some(waker) = wakers_guard.remove(&token) {
waker.wake();
}
}
}
}