mirror of
https://github.com/tc39/test262.git
synced 2025-05-03 22:40:28 +02:00
* [javascriptcore-test262-automation] changes from git@github.com:WebKit/webkit.git at sha 949e26452cfa153a7f4afe593da97e2fe9e1b706 on Tue Jul 03 2018 14:35:15 GMT-0400 (Eastern Daylight Time)
128 lines
3.2 KiB
JavaScript
128 lines
3.2 KiB
JavaScript
//@ skip
|
|
|
|
var sab = new SharedArrayBuffer(100 * 4);
|
|
|
|
var memory = new Int32Array(sab);
|
|
|
|
var numWorkers = 0;
|
|
function startWorker(code)
|
|
{
|
|
print("Starting worker!");
|
|
|
|
numWorkers++;
|
|
$.agent.start(code);
|
|
}
|
|
|
|
resources = `
|
|
function wait(memory, index, waitCondition, wakeCondition)
|
|
{
|
|
while (memory[index] == waitCondition) {
|
|
var result = Atomics.wait(memory, index, waitCondition);
|
|
switch (result) {
|
|
case "not-equal":
|
|
case "ok":
|
|
break;
|
|
default:
|
|
$.agent.report("Error: bad result from wait: " + result);
|
|
$.agent.report("error");
|
|
break;
|
|
}
|
|
var value = memory[index];
|
|
if (value != wakeCondition) {
|
|
$.agent.report("Error: wait returned not-equal but the memory has a bad value: " + value);
|
|
$.agent.report("error");
|
|
}
|
|
}
|
|
var value = memory[index];
|
|
if (value != wakeCondition) {
|
|
$.agent.report("Error: done waiting but the memory has a bad value: " + value);
|
|
$.agent.report("error");
|
|
}
|
|
}
|
|
|
|
function wake(memory, index)
|
|
{
|
|
var result = Atomics.wake(memory, index, 1);
|
|
if (result != 0 && result != 1) {
|
|
$.agent.report("Error: bad result from wake: " + result);
|
|
$.agent.report("error");
|
|
}
|
|
}
|
|
`;
|
|
|
|
startWorker(
|
|
resources + `
|
|
$.agent.receiveBroadcast(sab => {
|
|
var memory = new Int32Array(sab);
|
|
var didStartIdx = 0;
|
|
var shouldGoIdx = 1;
|
|
var didEndIdx = 2;
|
|
|
|
$.agent.report("1: Started!");
|
|
$.agent.report("1: Memory: " + memory);
|
|
|
|
wait(memory, didStartIdx, 0, 1);
|
|
|
|
$.agent.report("1: It started!");
|
|
|
|
memory[shouldGoIdx] = 1;
|
|
wake(memory, shouldGoIdx);
|
|
|
|
wait(memory, didEndIdx, 0, 1);
|
|
|
|
$.agent.report("1: All done!");
|
|
$.agent.report("1: Memory: " + memory);
|
|
$.agent.report("done");
|
|
});
|
|
`);
|
|
|
|
startWorker(
|
|
resources + `
|
|
$.agent.receiveBroadcast(sab => {
|
|
var memory = new Int32Array(sab);
|
|
var didStartIdx = 0;
|
|
var shouldGoIdx = 1;
|
|
var didEndIdx = 2;
|
|
|
|
$.agent.report("2: Started!");
|
|
$.agent.report("2: Memory: " + memory);
|
|
|
|
Atomics.store(memory, didStartIdx, 1);
|
|
wake(memory, didStartIdx);
|
|
|
|
wait(memory, shouldGoIdx, 0, 1);
|
|
|
|
Atomics.store(memory, didEndIdx, 1);
|
|
wake(memory, didEndIdx, 1);
|
|
|
|
$.agent.report("2: Memory: " + memory);
|
|
$.agent.report("done");
|
|
});
|
|
`);
|
|
|
|
$.agent.broadcast(sab);
|
|
|
|
for (;;) {
|
|
var report = waitForReport();
|
|
if (report == "done") {
|
|
if (!--numWorkers) {
|
|
print("All workers done!");
|
|
break;
|
|
}
|
|
} else if (report == "error") {
|
|
print("Test failed!");
|
|
throw new Error("Test failed.");
|
|
} else
|
|
print("report: " + report);
|
|
}
|
|
|
|
for (var i = 0; i < 3; ++i) {
|
|
if (memory[i] != 1)
|
|
throw "Error: Bad value at memory[" + i + "]: " + memory[i];
|
|
}
|
|
for (var i = 3; i < memory.length; ++i) {
|
|
if (memory[i] != 0)
|
|
throw "Error: Bad value at memory[" + i + "]: " + memory[i];
|
|
}
|
|
print("Test passed!");
|