lustre_executor/
reactor.rs1use mio::Poll as MioPoll;
2use mio::{Events, Interest, Token};
3use std::collections::HashMap;
4use std::io;
5use std::task::{Context, Poll as TaskPoll, Waker};
6
7pub struct Reactor {
8 poll: MioPoll,
9 events: Events,
10 wakers: HashMap<Token, Waker>,
11 next_token: usize,
12}
13
14impl Reactor {
15 pub fn new() -> io::Result<Self> {
16 Ok(Self {
17 poll: MioPoll::new()?,
18 events: Events::with_capacity(1024),
19 wakers: HashMap::new(),
20 next_token: 0,
21 })
22 }
23
24 pub fn register(
25 &mut self,
26 source: &mut impl mio::event::Source,
27 interest: Interest,
28 waker: Waker,
29 ) -> Token {
30 let token = Token(self.next_token);
31 self.next_token += 1;
32 self.poll
33 .registry()
34 .register(source, token, interest)
35 .unwrap();
36 self.wakers.insert(token, waker);
37 token
38 }
39
40 pub fn poll(&mut self, _cx: &mut Context) -> TaskPoll<()> {
41 self.poll
42 .poll(&mut self.events, Some(std::time::Duration::from_millis(0)))
43 .unwrap();
44 for event in &self.events {
45 if let Some(waker) = self.wakers.get(&event.token()) {
46 waker.wake_by_ref();
47 }
48 }
49 if self.events.is_empty() {
50 TaskPoll::Pending
51 } else {
52 TaskPoll::Ready(())
53 }
54 }
55}