Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/test-programs/src/bin/async_poll_synchronous.rs
3068 views
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
83