Skip to main content

strop_engine/editor/events/
channel.rs

1//! Event transport, not another reducer. Both the priority input lane and native
2//! job lane wake the owning driver; park/unpark's retained token prevents a lost
3//! wake between observing an empty queue and parking.
4use super::AppEvent;
5use std::sync::mpsc::{self, Receiver, SendError};
6
7#[derive(Clone)]
8pub struct EventSender {
9    sender: mpsc::Sender<AppEvent>,
10    owner: std::thread::Thread,
11}
12impl EventSender {
13    pub fn send(&self, event: AppEvent) -> Result<(), Box<SendError<AppEvent>>> {
14        self.sender.send(event).map_err(Box::new)?;
15        self.owner.unpark();
16        Ok(())
17    }
18}
19pub fn channel() -> (EventSender, Receiver<AppEvent>) {
20    let (sender, receiver) = mpsc::channel();
21    (
22        EventSender {
23            sender,
24            owner: std::thread::current(),
25        },
26        receiver,
27    )
28}
29
30/// Fairness limits apply between events; expensive work itself belongs on a worker.
31pub const EVENTS_PER_TURN: usize = 32;
32pub const TURN_BUDGET: std::time::Duration = std::time::Duration::from_millis(2);