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