Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/test-programs/src/bin/async_yield_caller_cancel.rs
1693 views
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::{
13
exports::local::local::run::Guest,
14
local::local::{continue_, ready},
15
},
16
test_programs::async_::{STATUS_RETURNED, STATUS_STARTED, subtask_cancel},
17
};
18
19
#[cfg(target_arch = "wasm32")]
20
#[link(wasm_import_module = "local:local/run")]
21
unsafe extern "C" {
22
#[link_name = "[async-lower][async]run"]
23
fn run() -> u32;
24
}
25
#[cfg(not(target_arch = "wasm32"))]
26
unsafe extern "C" fn run() -> u32 {
27
unreachable!()
28
}
29
30
struct Component;
31
32
impl Guest for Component {
33
async fn run() {
34
ready::set_ready(true);
35
continue_::set_continue(true);
36
37
unsafe {
38
let status = run();
39
let waitable = status >> 4;
40
let status = status & 0xF;
41
assert_eq!(status, STATUS_STARTED);
42
43
// Here we assume the following:
44
//
45
// - Wasmtime will deliver a cancel event to the callee before returning
46
// from `subtask_cancel`.
47
//
48
// - The callee will immediately return as soon as it receives the
49
// event.
50
let status = subtask_cancel(waitable);
51
assert_eq!(status, STATUS_RETURNED);
52
}
53
}
54
}
55
56
// Unused function; required since this file is built as a `bin`:
57
fn main() {}
58
59