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, subtask_drop, waitable_join, waitable_set_drop,
16         waitable_set_new, waitable_set_poll,
17     },
18 };
19 
20 fn async_when_ready() -> u32 {
21     #[cfg(not(target_arch = "wasm32"))]
22     {
23         unreachable!()
24     }
25 
26     #[cfg(target_arch = "wasm32")]
27     {
28         #[link(wasm_import_module = "local:local/ready")]
29         unsafe extern "C" {
30             #[link_name = "[async-lower]when-ready"]
31             fn call_when_ready() -> u32;
32         }
33         unsafe { call_when_ready() }
34     }
35 }
36 
37 struct Component;
38 
39 impl Guest for Component {
40     fn run() {
41         unsafe {
42             ready::set_ready(false);
43 
44             let set = waitable_set_new();
45 
46             assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
47 
48             let result = async_when_ready();
49             let status = result & 0xf;
50             let call = result >> 4;
51             assert!(status != STATUS_RETURNED);
52             waitable_join(call, set);
53 
54             assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
55 
56             ready::set_ready(true);
57 
58             let (event, task, code) = waitable_set_poll(set);
59             assert_eq!(event, EVENT_SUBTASK);
60             assert_eq!(call, task);
61             assert_eq!(code, STATUS_RETURNED);
62 
63             subtask_drop(task);
64 
65             assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
66 
67             assert_eq!(async_when_ready(), STATUS_RETURNED);
68 
69             assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
70 
71             waitable_set_drop(set);
72         }
73     }
74 }
75 
76 // Unused function; required since this file is built as a `bin`:
77 fn main() {}
78