minimal_executor/
lib.rs

1#![no_std]
2extern crate alloc;
3
4mod local_pool_new;
5mod local_pool_old;
6pub(crate) mod waker;
7mod local_pool_busy;
8
9pub use crate::local_pool_old::*;
10pub use crate::local_pool_new::LocalPool as NewLocalPool;
11pub use crate::local_pool_new::Spawner as NewSpawner;
12pub use crate::local_pool_busy::Spawner as BusySpawner;
13pub use crate::local_pool_busy::LocalPool as BusyLocalPool;
14
15use core::future::{Future};
16use core::task::{Poll, Context};
17use crate::waker::{AlwaysWake, waker_ref};
18
19pub fn poll_fn<T, F: FnOnce(&mut Context<'_>) -> T>(f: F) -> T {
20    let waker = waker_ref(&AlwaysWake::INSTANCE);
21    let mut cx = Context::from_waker(&waker);
22    f(&mut cx)
23}
24
25pub fn block_fn<T, F: FnMut(&mut Context<'_>) -> Poll<T>>(mut f: F) -> T {
26    let waker = waker_ref(&AlwaysWake::INSTANCE);
27    let mut cx = Context::from_waker(&waker);
28    loop {
29        if let Poll::Ready(t) = f(&mut cx) {
30            return t;
31        }
32    }
33}
34
35pub fn poll_on<T, Fut: Future<Output = T>>(f: Fut) -> Poll<Fut::Output> {
36    futures::pin_mut!(f);
37    poll_fn(|cx| f.as_mut().poll(cx))
38}
39
40
41pub fn block_on<T, Fut: Future<Output = T>>(f: Fut) -> Fut::Output {
42    futures::pin_mut!(f);
43    block_fn(|cx| f.as_mut().poll(cx))
44}