Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/test-programs/src/bin/async_yield_caller.rs
3070 views
1
mod bindings {
2
wit_bindgen::generate!({
3
path: "../misc/component-async-tests/wit",
4
world: "yield-caller",
5
});
6
7
use super::Component;
8
export!(Component);
9
}
10
11
use {
12
bindings::{
13
exports::local::local::run::Guest,
14
local::local::{continue_, ready, run},
15
},
16
futures::future,
17
std::{future::Future, task::Poll},
18
};
19
20
struct Component;
21
22
impl Guest for Component {
23
async fn run() {
24
let thing = ready::Thing::new();
25
thing.set_ready(false);
26
continue_::set_continue(true);
27
28
let mut ready = Some(Box::pin(thing.when_ready()));
29
let mut run = Some(Box::pin(run::run()));
30
future::poll_fn(|cx| {
31
let ready_poll = ready.as_mut().map(|v| v.as_mut().poll(cx));
32
thing.set_ready(true);
33
let run_poll = run.as_mut().map(|v| v.as_mut().poll(cx));
34
35
match (run_poll, ready_poll) {
36
(None | Some(Poll::Ready(())), None | Some(Poll::Ready(()))) => {
37
return Poll::Ready(());
38
}
39
(Some(Poll::Ready(())), _) => run = None,
40
(_, Some(Poll::Ready(()))) => {
41
ready = None;
42
continue_::set_continue(false);
43
}
44
_ => {}
45
}
46
47
Poll::Pending
48
})
49
.await
50
}
51
}
52
53
// Unused function; required since this file is built as a `bin`:
54
fn main() {}
55
56