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
1693 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, 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][async]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
79