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
1693 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
ready::set_ready(false);
25
continue_::set_continue(true);
26
27
let mut ready = Some(Box::pin(ready::when_ready()));
28
let mut run = Some(Box::pin(run::run()));
29
future::poll_fn(move |cx| {
30
let ready_poll = ready.as_mut().map(|v| v.as_mut().poll(cx));
31
ready::set_ready(true);
32
let run_poll = run.as_mut().map(|v| v.as_mut().poll(cx));
33
34
match (run_poll, ready_poll) {
35
(None | Some(Poll::Ready(())), None | Some(Poll::Ready(()))) => {
36
return Poll::Ready(());
37
}
38
(Some(Poll::Ready(())), _) => run = None,
39
(_, Some(Poll::Ready(()))) => {
40
ready = None;
41
continue_::set_continue(false);
42
}
43
_ => {}
44
}
45
46
Poll::Pending
47
})
48
.await
49
}
50
}
51
52
// Unused function; required since this file is built as a `bin`:
53
fn main() {}
54
55