Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --setpref=atomics_wait_async=true; skip-if: helperThreadCount() === 0;
// Test deleting the SAB and timing out.
function test1() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 1).value;
assertEq(!!o.sab, true);
delete o.sab;
assertEq(!!o.sab, false);
return promise;
}
// Test deleting the SAB and notify.
function test2() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 100).value;
assertEq(!!o.sab, true);
delete o.sab;
assertEq(!!o.sab, false);
Atomics.notify(o.ia, 37);
return promise;
}
// Test deleting the SAB without timeout and notify.
function test3() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var promise = Atomics.waitAsync(o.ia, 37, 0x1337).value;
assertEq(!!o.sab, true);
delete o.sab;
assertEq(!!o.sab, false);
Atomics.notify(o.ia, 37);
return promise;
}
// Test deleting the SAB with immediate resolution.
function test4() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var v = Atomics.waitAsync(o.ia, 37, 0x1337, 0).value;
assertEq(!!o.sab, true);
delete o.sab;
assertEq(!!o.sab, false);
assertEq(v, "timed-out");
return v;
}
// Store the result of the tests when run in the worker thread.
// Each test increments this value by one if it succeeds
let sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
setSharedObject(sab);
// same tests as above but with a worker
function test5() {
evalInWorker(`
const i32 = new Int32Array(getSharedObject());
function test1() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 1).value;
delete o.sab;
return promise;
}
// Test deleting the SAB and notify.
function test2() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 10).value;
delete o.sab;
Atomics.notify(o.ia, 37);
return promise;
}
// Test deleting the SAB without timeout and notify.
function test3() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var promise = Atomics.waitAsync(o.ia, 37, 0x1337).value;
delete o.sab;
Atomics.notify(o.ia, 37);
return promise;
}
// Test deleting the SAB with immediate resolution.
function test4() {
var o = {};
o.sab = new SharedArrayBuffer(4096);
o.ia = new Int32Array(o.sab);
o.ia[37] = 0x1337;
var v = Atomics.waitAsync(o.ia, 37, 0x1337, 0).value;
delete o.sab;
return v;
}
// Custom Timeout to ensure that we wait until waitAsync times out.
function timeout(n) {
var start = Date.now();
while (Date.now() - start < n) {};
}
var result = "";
test1()
.then((v) => { result = v });
timeout(10);
drainJobQueue();
if (result == "timed-out") {
Atomics.add(i32, 0, 1);
}
result = "";
test2()
.then((v) => { result = v });
drainJobQueue();
if (result == "ok") {
Atomics.add(i32, 0, 1);
}
result = "";
test3()
.then((v) => { result = v });
drainJobQueue();
if (result == "ok") {
Atomics.add(i32, 0, 1);
}
result = "";
result = test4();
drainJobQueue();
if (result == "timed-out") {
Atomics.add(i32, 0, 1);
}
`);
}
// Custom Timeout to ensure that we wait until waitAsync times out.
function timeout(n) {
var start = Date.now();
while (Date.now() - start < n) {};
}
var result = "";
test1()
.then((v) => { result = v });
timeout(10);
drainJobQueue();
assertEq(result, "timed-out");
result = "";
test2()
.then((v) => { result = v });
drainJobQueue();
assertEq(result, "ok");
result = "";
test3()
.then((v) => { result = v });
drainJobQueue();
assertEq(result, "ok");
result = "";
result = test4();
drainJobQueue();
assertEq(result, "timed-out");
test5();
let i32 = new Int32Array(sab);
while (Atomics.load(i32, 0) != 4) {};