blob: 8dd42d60f2965febd5fdb9b6d1ba57fa54eecb6c [file] [log] [blame]
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="resources/wasm-constants.js"></script>
<script src="resources/wasm-module-builder.js"></script>
<script>
const test = async_test("TestWasmWorkerTerminationWhileCompiling");
const kNumWorkers = 8;
const kNumFunctions = 5000;
// This function is executed by each worker.
function workerFunction() {
onmessage = function(event) {
// Start asynchronous compilation, then notify the main thread about that.
WebAssembly.compile(event.data)
.catch(e => postMessage("compilation error: " + e));
postMessage("compiling");
};
}
// Build a wasm module with a number of function, such that the workers need
// some time compiling it.
const builder = new WasmModuleBuilder();
for (var i = 0; i < kNumFunctions; ++i) {
builder.addFunction('func' + i, kSig_v_v).addBody([kExprCallFunction, 0]);
}
const module_bytes = builder.toBuffer();
const blobURL =
URL.createObjectURL(new Blob(['(' + workerFunction.toString() + ')()']));
// Counter to wait for all workers to start compilation.
var outstanding_worker_events = kNumWorkers;
const workers = [];
function workerEvent(event) {
// If the event data is not "compiling", this is an error in the worker.
assert_equals(event.data, "compiling");
// Decrement counter of workers that did not start compiling yet.
// Do nothing if there are still outstanding workers.
assert_greater_than(outstanding_worker_events, 0);
if (--outstanding_worker_events > 0) return;
// All workers started compiling! Now terminate them all. This should not
// crash.
for (let i = 0; i < kNumWorkers; ++i) {
workers[i].terminate();
}
test.done();
}
for (let i = 0; i < kNumWorkers; ++i) {
const worker = new Worker(blobURL);
worker.onmessage = test.step_func(workerEvent);
worker.postMessage(module_bytes);
workers.push(worker);
}
</script>