From d785f0f670eaded0db6c2594bf9d7c34122f6e1a Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 1 Jun 2023 20:14:26 +0900 Subject: [PATCH] yet another wat --- wat/wasi-threads/many_spawn.wat.in | 95 ++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 wat/wasi-threads/many_spawn.wat.in diff --git a/wat/wasi-threads/many_spawn.wat.in b/wat/wasi-threads/many_spawn.wat.in new file mode 100644 index 00000000..813b114a --- /dev/null +++ b/wat/wasi-threads/many_spawn.wat.in @@ -0,0 +1,95 @@ +;; m4 many_spawn.wat.in|wat2wasm --enable-threads -o many_spawn.wasm - + +ifdef(`NUM',,`define(`NUM',100000)') + +define(`_repeat',`ifelse(eval($1<=$2),1,`$3`'$0(incr($1),$2,`$3')')')dnl +define(`repeat',`_repeat(1,$1,``$2'')')dnl + +define(`EXPECTED',`syscmd(echo "(NUM * (NUM + 1) / 2) % 4294967296" | bc)') + +(module + (memory (export "memory") (import "env" "memory") 1 1 shared) + (func $thread_spawn (import "wasi" "thread-spawn") (param i32) (result i32)) + (func (export "wasi_thread_start") (param $tid i32) (param $user_arg i32) + local.get $user_arg + call $notify + ) + (func $notify (param $v i32) + i32.const 4 + local.get $v + i32.atomic.rmw.add + drop + i32.const 0 + i32.const 1 + i32.atomic.rmw.sub + i32.const 1 + i32.ne + br_if 0 + i32.const 0 + i32.const 1 + memory.atomic.notify + drop + ) + (func $spawn (param i32) + ;; spawn a thread + local.get 0 + call $thread_spawn + ;; check error + i32.const 0 + i32.le_s + if + unreachable + end + ) + (func $test (export "test") (param $num i32) (result i32) (local $tmp i32) + i32.const 0 + local.get $num + i32.store + ;; spawn threads + local.get $num + loop (param i32) + local.tee $tmp + local.get $tmp + call $spawn + i32.const 1 + i32.sub + local.tee $tmp + local.get $tmp + br_if 0 + drop + end + ;; wait for the threads to finish + block + loop + i32.const 0 + i32.atomic.load + local.tee $tmp + i32.eqz + br_if 1 + i32.const 0 + local.get $tmp + i64.const -1 + memory.atomic.wait32 + ;; assert it was not a timeout + i32.const 2 + i32.eq + if + unreachable + end + br 0 + end + end + i32.const 4 + i32.load + ) + (func (export "_start") + i32.const NUM + call $test + i32.const EXPECTED + i32.eq + block (param i32) + br_if 0 + unreachable + end + ) +)