wasi_async_runtime/
block_on.rs1use super::Reactor;
2
3use core::future::Future;
4use core::pin::pin;
5use core::ptr;
6use core::task::Waker;
7use core::task::{Context, Poll, RawWaker, RawWakerVTable};
8
9pub fn block_on<F, Fut>(f: F) -> Fut::Output
11where
12 F: FnOnce(Reactor) -> Fut,
13 Fut: Future,
14{
15 let reactor = Reactor::new();
17
18 let fut = (f)(reactor.clone());
20 let mut fut = pin!(fut);
21
22 let waker = noop_waker();
24 let mut cx = Context::from_waker(&waker);
25
26 loop {
29 match fut.as_mut().poll(&mut cx) {
30 Poll::Ready(res) => return res,
31 Poll::Pending => reactor.block_until(),
32 }
33 }
34}
35
36fn noop_waker() -> Waker {
39 const VTABLE: RawWakerVTable = RawWakerVTable::new(
40 |_| RAW,
42 |_| {},
44 |_| {},
46 |_| {},
48 );
49 const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE);
50
51 unsafe { Waker::from_raw(RAW) }
53}