Skip to content

Commit 4d9def2

Browse files
committed
Add tests/async/wait-during-callback.wast
1 parent 25bb536 commit 4d9def2

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
;; This test calls waitable-set.wait from under an async-callback-lifted export.
2+
(component
3+
(core module $Memory (memory (export "mem") 1))
4+
(core instance $memory (instantiate $Memory))
5+
(core module $CM
6+
(import "" "mem" (memory 1))
7+
(import "" "task.return" (func $task.return (param i32)))
8+
(import "" "waitable.join" (func $waitable.join (param i32 i32)))
9+
(import "" "waitable-set.new" (func $waitable-set.new (result i32)))
10+
(import "" "waitable-set.wait" (func $waitable-set.wait (param i32 i32) (result i32)))
11+
(import "" "future.new" (func $future.new (result i64)))
12+
(import "" "future.read" (func $future.read (param i32 i32) (result i32)))
13+
(import "" "future.write" (func $future.write (param i32 i32) (result i32)))
14+
15+
(func $run (export "run") (result i32)
16+
(local $ret i32) (local $ret64 i64)
17+
(local $futr i32) (local $futw i32) (local $ws i32)
18+
(local $event_code i32) (local $retp i32)
19+
20+
;; create a future pair
21+
(local.set $ret64 (call $future.new))
22+
(local.set $futr (i32.wrap_i64 (local.get $ret64)))
23+
(local.set $futw (i32.wrap_i64 (i64.shr_u (local.get $ret64) (i64.const 32))))
24+
25+
;; start a pending read that will block
26+
(local.set $ret (call $future.read (local.get $futr) (i32.const 0xdeadbeef)))
27+
(if (i32.ne (i32.const -1 (; BLOCKED ;)) (local.get $ret))
28+
(then unreachable))
29+
30+
;; perform a write to make the above read ready
31+
(local.set $ret (call $future.write (local.get $futw) (i32.const 0xdeadbeef)))
32+
(if (i32.ne (i32.const 0 (; COMPLETED ;)) (local.get $ret))
33+
(then unreachable))
34+
35+
;; wait on a waitable set containing our now-ready future.read which
36+
;; should then immediately resolve
37+
(local.set $ws (call $waitable-set.new))
38+
(call $waitable.join (local.get $futr) (local.get $ws))
39+
(local.set $retp (i32.const 0))
40+
(local.set $event_code (call $waitable-set.wait (local.get $ws) (local.get $retp)))
41+
(if (i32.ne (i32.const 4 (; FUTURE_READ ;)) (local.get $event_code))
42+
(then unreachable))
43+
(if (i32.ne (local.get $futr) (i32.load (local.get $retp)))
44+
(then unreachable))
45+
(if (i32.ne (i32.const 2 (; RETURNED=2 ;)) (i32.load offset=4 (local.get $retp)))
46+
(then unreachable))
47+
48+
;; return 42
49+
(call $task.return (i32.const 42))
50+
(i32.const 0 (; EXIT ;))
51+
)
52+
(func (export "run_cb") (param i32 i32 i32) (result i32)
53+
unreachable
54+
)
55+
)
56+
(type $FT (future))
57+
(canon task.return (result u32) (core func $task.return))
58+
(canon waitable.join (core func $waitable.join))
59+
(canon waitable-set.new (core func $waitable-set.new))
60+
(canon waitable-set.wait (memory $memory "mem") (core func $waitable-set.wait))
61+
(canon future.new $FT (core func $future.new))
62+
(canon future.read $FT async (core func $future.read))
63+
(canon future.write $FT async (core func $future.write))
64+
(core instance $cm (instantiate $CM (with "" (instance
65+
(export "mem" (memory $memory "mem"))
66+
(export "task.return" (func $task.return))
67+
(export "waitable.join" (func $waitable.join))
68+
(export "waitable-set.new" (func $waitable-set.new))
69+
(export "waitable-set.wait" (func $waitable-set.wait))
70+
(export "future.new" (func $future.new))
71+
(export "future.read" (func $future.read))
72+
(export "future.write" (func $future.write))
73+
))))
74+
(func (export "run") (result u32) (canon lift
75+
(core func $cm "run")
76+
async (callback (func $cm "run_cb"))
77+
))
78+
)
79+
(assert_return (invoke "run") (u32.const 42))

0 commit comments

Comments
 (0)