1 mod bindings { 2 wit_bindgen::generate!({ 3 path: "../misc/component-async-tests/wit", 4 world: "yield-caller", 5 }); 6 7 use super::Component; 8 export!(Component); 9 } 10 11 use { 12 bindings::{exports::local::local::run::Guest, local::local::continue_}, 13 test_programs::async_::{STATUS_RETURNED, STATUS_STARTED, subtask_cancel}, 14 }; 15 16 #[cfg(target_arch = "wasm32")] 17 #[link(wasm_import_module = "local:local/run")] 18 unsafe extern "C" { 19 #[link_name = "[async-lower]run"] run() -> u3220 fn run() -> u32; 21 } 22 #[cfg(not(target_arch = "wasm32"))] run() -> u3223unsafe extern "C" fn run() -> u32 { 24 unreachable!() 25 } 26 27 struct Component; 28 29 impl Guest for Component { run()30 async fn run() { 31 continue_::set_continue(true); 32 33 unsafe { 34 let status = run(); 35 let waitable = status >> 4; 36 let status = status & 0xF; 37 assert_eq!(status, STATUS_STARTED); 38 39 // Here we assume the following: 40 // 41 // - Wasmtime will deliver a cancel event to the callee before returning 42 // from `subtask_cancel`. 43 // 44 // - The callee will immediately return as soon as it receives the 45 // event. 46 let status = subtask_cancel(waitable); 47 assert_eq!(status, STATUS_RETURNED); 48 } 49 } 50 } 51 52 // Unused function; required since this file is built as a `bin`: main()53fn main() {} 54