Skip to main content

lustre_executor/
reactor.rs

1use 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}