1
0
Fork 0
forked from wry/wry

async_engine: move toplevel scheduler into crate

This commit is contained in:
kossLAN 2026-05-29 12:10:40 -04:00
parent 7d9cd198ba
commit 9606e0892c
No known key found for this signature in database
3 changed files with 7 additions and 6 deletions

View file

@ -1,7 +1,8 @@
mod ae_task;
mod ae_yield;
mod run_toplevel;
pub use {ae_task::SpawnedFuture, ae_yield::Yield};
pub use {ae_task::SpawnedFuture, ae_yield::Yield, run_toplevel::*};
use {
crate::ae_task::Runnable,
jay_time::Time,

View file

@ -0,0 +1,44 @@
use {
crate::{AsyncEngine, SpawnedFuture},
jay_utils::queue::AsyncQueue,
std::rc::Rc,
};
pub struct RunToplevelFuture {
_future: SpawnedFuture<()>,
}
pub struct RunToplevel {
queue: AsyncQueue<Box<dyn FnOnce()>>,
}
impl RunToplevel {
pub fn install(eng: &Rc<AsyncEngine>) -> (RunToplevelFuture, Rc<RunToplevel>) {
let slf = Rc::new(RunToplevel {
queue: Default::default(),
});
let future = eng.spawn("run toplevel", {
let slf = slf.clone();
async move {
loop {
let f = slf.queue.pop().await;
f();
}
}
});
let future = RunToplevelFuture { _future: future };
(future, slf)
}
pub fn schedule<F: FnOnce() + 'static>(&self, f: F) {
self.schedule_dyn(Box::new(f));
}
pub fn clear(&self) {
self.queue.clear();
}
fn schedule_dyn(&self, f: Box<dyn FnOnce()>) {
self.queue.push(f);
}
}