| import * as assert from '../assert.js'; |
| |
| const num = 3; |
| const count = 1e5; |
| |
| let memory = new WebAssembly.Memory({ |
| initial: 1, |
| maximum: 1, |
| shared: true |
| }); |
| let buffer = new Int32Array(memory.buffer); |
| |
| for (let i = 0; i < num; ++i) { |
| $.agent.start(` |
| import("../wabt-wrapper.js").then(({ instantiate }) => { |
| $262.agent.receiveBroadcast(function(memory) { |
| $262.agent.sleep(1); |
| (async function () { |
| let wat = \` |
| (module |
| (memory (import "env" "memory") 1 1 shared) |
| (func (export "add") (result i32) (i32.atomic.rmw.sub (i32.const 0) (i32.const 1))) |
| )\`; |
| let instance = await instantiate(wat, { |
| env: { memory } |
| }, { threads: true }); |
| for (var i = 0; i < ${count}; ++i) |
| instance.exports.add(); |
| $262.agent.report(0); |
| $262.agent.leaving(); |
| })(); |
| }); |
| }, (error) => { print(error); }); |
| `, import.meta.filename); |
| } |
| |
| $262.agent.broadcast(memory); |
| let done = 0; |
| while (true) { |
| let report = $262.agent.getReport(); |
| if (report !== null) |
| done++; |
| if (done === num) |
| break; |
| $262.agent.sleep(1); |
| } |
| assert.eq(buffer[0], -(count * num)); |