1 mod bindings {
2 wit_bindgen::generate!({
3 path: "../misc/component-async-tests/wit",
4 world: "poll",
5 async: false,
6 });
7
8 use super::Component;
9 export!(Component);
10 }
11
12 use {
13 bindings::{exports::local::local::run::Guest, local::local::ready},
14 test_programs::async_::{
15 EVENT_NONE, EVENT_SUBTASK, STATUS_RETURNED, SUSPEND_RESULT_NOT_CANCELLED, subtask_drop,
16 thread_yield, waitable_join, waitable_set_drop, waitable_set_new, waitable_set_poll,
17 },
18 };
19
async_when_ready(handle: u32) -> u3220 fn async_when_ready(handle: u32) -> u32 {
21 #[cfg(not(target_arch = "wasm32"))]
22 {
23 _ = handle;
24 unreachable!()
25 }
26
27 #[cfg(target_arch = "wasm32")]
28 {
29 #[link(wasm_import_module = "local:local/ready")]
30 unsafe extern "C" {
31 #[link_name = "[async-lower][method]thing.when-ready"]
32 fn call_when_ready(handle: u32) -> u32;
33 }
34 unsafe { call_when_ready(handle) }
35 }
36 }
37
38 struct Component;
39
40 impl Guest for Component {
run()41 fn run() {
42 unsafe {
43 let thing = ready::Thing::new();
44 thing.set_ready(false);
45
46 let set = waitable_set_new();
47
48 assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
49
50 let result = async_when_ready(thing.handle());
51 let status = result & 0xf;
52 let call = result >> 4;
53 assert!(status != STATUS_RETURNED);
54 waitable_join(call, set);
55
56 assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
57
58 thing.set_ready(true);
59
60 assert_eq!(thread_yield(), SUSPEND_RESULT_NOT_CANCELLED);
61
62 let (event, task, code) = waitable_set_poll(set);
63 assert_eq!(event, EVENT_SUBTASK);
64 assert_eq!(call, task);
65 assert_eq!(code, STATUS_RETURNED);
66
67 subtask_drop(task);
68
69 assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
70
71 assert_eq!(async_when_ready(thing.handle()), STATUS_RETURNED);
72
73 assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
74
75 waitable_set_drop(set);
76 }
77 }
78 }
79
80 // Unused function; required since this file is built as a `bin`:
main()81 fn main() {}
82