Skip to main content

web_admin/
executor.rs

1use core::{
2    future::Future,
3    pin::Pin,
4    task::{Context, Poll, RawWaker, RawWakerVTable, Waker},
5};
6
7/// Implements noop raw waker.
8fn noop_raw_waker() -> RawWaker {
9    /// Implements noop.
10    fn noop(_: *const ()) {}
11    /// Implements clone.
12    fn clone(_: *const ()) -> RawWaker {
13        noop_raw_waker()
14    }
15    static VTABLE: RawWakerVTable = RawWakerVTable::new(clone, noop, noop, noop);
16    RawWaker::new(core::ptr::null(), &VTABLE)
17}
18
19pub fn block_on<F: Future>(mut f: F) -> F::Output {
20    // SAFETY: we never move `f` after pinning; single-threaded context.
21    let waker = unsafe { Waker::from_raw(noop_raw_waker()) };
22    let mut cx = Context::from_waker(&waker);
23    loop {
24        let pinned = unsafe { Pin::new_unchecked(&mut f) };
25        match pinned.poll(&mut cx) {
26            Poll::Ready(val) => return val,
27            Poll::Pending => {
28                let _ = strat9_syscall::call::sched_yield();
29            }
30        }
31    }
32}