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