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 20 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 { 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`: 81 fn main() {} 82