1use core::{
2 future::Future,
3 pin::Pin,
4 task::{Context, Poll, RawWaker, RawWakerVTable, Waker},
5};
6
7fn noop_raw_waker() -> RawWaker {
9 fn noop(_: *const ()) {}
11 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 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}