Atomics: wait/bigint cleanup

This commit is contained in:
Rick Waldron 2018-05-18 20:52:31 -04:00
parent ab72a55748
commit daa9af846d
15 changed files with 179 additions and 161 deletions

View File

@ -18,7 +18,7 @@ features: [Atomics, BigInt, SharedArrayBuffer, TypedArray]
flags: [CanBlockIsFalse] flags: [CanBlockIsFalse]
---*/ ---*/
var buffer = new SharedArrayBuffer(4); var buffer = new SharedArrayBuffer(8);
var i64a = new BigInt64Array(buffer); var i64a = new BigInt64Array(buffer);
assert.throws(TypeError, function() { assert.throws(TypeError, function() {

View File

@ -24,18 +24,21 @@ function getReport() {
} }
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab, id) { $262.agent.receiveBroadcast(function(sab, id) {
var ia = new BigInt64Array(sab); const i64a = new BigInt64Array(sab);
var then = $262.agent.monotonicNow(); const then = $262.agent.monotonicNow();
$262.agent.report(Atomics.wait(ia, 0, 0, 500)); // Timeout 500ms $262.agent.report(Atomics.wait(i64a, 0, 0, 500)); // Timeout 500ms
$262.agent.report($262.agent.monotonicNow() - then); // Actual time can be more than 500ms $262.agent.report($262.agent.monotonicNow() - then); // Actual time can be more than 500ms
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
var ia = new BigInt64Array(new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)); const i64a = new BigInt64Array(
new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
);
$262.agent.broadcast(ia.buffer); $262.agent.broadcast(i64a.buffer);
$262.agent.sleep(100);
assert.sameValue(getReport(), "timed-out"); assert.sameValue(getReport(), "timed-out");
assert.sameValue((getReport() | 0) >= 500 - $ATOMICS_MAX_TIME_EPSILON, true); assert.sameValue((getReport() | 0) >= 500 - $ATOMICS_MAX_TIME_EPSILON, true);

View File

@ -24,43 +24,45 @@ function getReport() {
} }
$262.agent.start(` $262.agent.start(`
var valueOf = { var valueOf = {
valueOf: function() { valueOf: function() {
return false; return false;
} }
}; };
var toPrimitive = { var toPrimitive = {
[Symbol.toPrimitive]: function() { [Symbol.toPrimitive]: function() {
return false; return false;
} }
}; };
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i64a = new BigInt64Array(sab); var i64a = new BigInt64Array(sab);
var start = $262.agent.monotonicNow(); var start = $262.agent.monotonicNow();
$262.agent.report(Atomics.wait(i64a, 0, 0, false)); $262.agent.report(Atomics.wait(i64a, 0, 0, false));
$262.agent.report(Atomics.wait(i64a, 0, 0, valueOf)); $262.agent.report(Atomics.wait(i64a, 0, 0, valueOf));
$262.agent.report(Atomics.wait(i64a, 0, 0, toPrimitive)); $262.agent.report(Atomics.wait(i64a, 0, 0, toPrimitive));
$262.agent.report($262.agent.monotonicNow() - start); $262.agent.report($262.agent.monotonicNow() - start);
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
var i64a = new BigInt64Array(new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)); const i64a = new BigInt64Array(
new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
);
$262.agent.broadcast(i64a.buffer); $262.agent.broadcast(i64a.buffer);
$262.agent.sleep(150); $262.agent.sleep(100);
assert.sameValue(getReport(), 'timed-out'); assert.sameValue(getReport(), 'timed-out');
assert.sameValue(getReport(), 'timed-out'); assert.sameValue(getReport(), 'timed-out');
assert.sameValue(getReport(), 'timed-out'); assert.sameValue(getReport(), 'timed-out');
var timeDiffReport = getReport(); var lapse = getReport();
assert(timeDiffReport >= 0, 'timeout should be a min of 0ms'); assert(lapse >= 0, 'timeout should be a min of 0ms');
assert(timeDiffReport <= $ATOMICS_MAX_TIME_EPSILON, 'timeout should be a max of $$ATOMICS_MAX_TIME_EPSILON'); assert(lapse <= $ATOMICS_MAX_TIME_EPSILON, 'timeout should be a max of $$ATOMICS_MAX_TIME_EPSILON');
assert.sameValue(Atomics.wake(i64a, 0), 0); assert.sameValue(Atomics.wake(i64a, 0), 0);

View File

@ -13,34 +13,34 @@ features: [Atomics, BigInt]
// even in the shell. // even in the shell.
$262.agent.start(` $262.agent.start(`
var sab = new SharedArrayBuffer(1024); var sab = new SharedArrayBuffer(1024);
var ab = new ArrayBuffer(16); var ab = new ArrayBuffer(16);
var good_indices = [ (view) => 0/-1, // -0 var good_indices = [ (view) => 0/-1, // -0
(view) => '-0', (view) => '-0',
(view) => view.length - 1, (view) => view.length - 1,
(view) => ({ valueOf: () => 0 }), (view) => ({ valueOf: () => 0 }),
(view) => ({ toString: () => '0', valueOf: false }) // non-callable valueOf triggers invocation of toString (view) => ({ toString: () => '0', valueOf: false }) // non-callable valueOf triggers invocation of toString
]; ];
var view = new BigInt64Array(sab, 32, 20); var view = new BigInt64Array(sab, 32, 20);
view[0] = 0; view[0] = 0;
$262.agent.report("A " + Atomics.wait(view, 0, 0, 0)) $262.agent.report("A " + Atomics.wait(view, 0, 0, 0))
$262.agent.report("B " + Atomics.wait(view, 0, 37, 0)); $262.agent.report("B " + Atomics.wait(view, 0, 37, 0));
// In-bounds boundary cases for indexing // In-bounds boundary cases for indexing
for ( let IdxGen of good_indices ) { for ( let IdxGen of good_indices ) {
let Idx = IdxGen(view); let Idx = IdxGen(view);
view.fill(0); view.fill(0);
// Atomics.store() computes an index from Idx in the same way as other // Atomics.store() computes an index from Idx in the same way as other
// Atomics operations, not quite like view[Idx]. // Atomics operations, not quite like view[Idx].
Atomics.store(view, Idx, 37); Atomics.store(view, Idx, 37);
$262.agent.report("C " + Atomics.wait(view, Idx, 0)); $262.agent.report("C " + Atomics.wait(view, Idx, 0));
} }
$262.agent.report("done"); $262.agent.report("done");
$262.agent.leaving(); $262.agent.leaving();
`); `);
assert.sameValue(getReport(), "A timed-out"); assert.sameValue(getReport(), "A timed-out");

View File

@ -24,19 +24,19 @@ function getReport() {
return r; return r;
} }
$262.agent.start( $262.agent.start(`
` $262.agent.receiveBroadcast(function(sab) {
$262.agent.receiveBroadcast(function(sab) { var i64a = new BigInt64Array(sab);
var i64a = new BigInt64Array(sab); $262.agent.report(Atomics.wait(i64a, 0, 0, NaN)); // NaN => +Infinity
$262.agent.report(Atomics.wait(i64a, 0, 0, NaN)); // NaN => +Infinity $262.agent.leaving();
$262.agent.leaving(); });
});
`); `);
var i64a = new BigInt64Array(new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)); const i64a = new BigInt64Array(
new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
);
$262.agent.broadcast(i64a.buffer); $262.agent.broadcast(i64a.buffer);
$262.agent.sleep(500); // Ample time $262.agent.sleep(100);
assert.sameValue(Atomics.wake(i64a, 0), 1); assert.sameValue(Atomics.wake(i64a, 0), 1);
assert.sameValue(getReport(), "ok"); assert.sameValue(getReport(), "ok");

View File

@ -16,9 +16,10 @@ info: |
features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray]
---*/ ---*/
var sab = new SharedArrayBuffer(1024); const i64a = new BigInt64Array(
var i64a = new BigInt64Array(sab); new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
var poisoned = { );
const poisoned = {
valueOf: function() { valueOf: function() {
throw new Test262Error("should not evaluate this code"); throw new Test262Error("should not evaluate this code");
} }

View File

@ -17,15 +17,16 @@ function getReport() {
} }
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab, id) { $262.agent.receiveBroadcast(function(sab, id) {
var ia = new BigInt64Array(sab); var ia = new BigInt64Array(sab);
$262.agent.report(Atomics.wait(ia, 0, 0, -5)); // -5 => 0 $262.agent.report(Atomics.wait(ia, 0, 0, -5)); // -5 => 0
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
var buffer = new SharedArrayBuffer(1024); const i64a = new BigInt64Array(
var i64a = new BigInt64Array(buffer); new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
);
$262.agent.broadcast(i64a.buffer); $262.agent.broadcast(i64a.buffer);
assert.sameValue(getReport(), "timed-out"); assert.sameValue(getReport(), "timed-out");

View File

@ -9,7 +9,8 @@ features: [Atomics, BigInt, SharedArrayBuffer, TypedArray]
flags: [CanBlockIsFalse] flags: [CanBlockIsFalse]
---*/ ---*/
var buffer = new SharedArrayBuffer(1024); const i64a = new BigInt64Array(
var i64a = new BigInt64Array(buffer); new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
);
assert.sameValue(Atomics.wait(i64a, 0, 0, -1), "timed-out"); assert.sameValue(Atomics.wait(i64a, 0, 0, -1), "timed-out");

View File

@ -16,9 +16,11 @@ info: |
features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray]
---*/ ---*/
var i64a = new BigInt64Array(new SharedArrayBuffer(4)); const i64a = new BigInt64Array(
new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
);
var poisoned = { const poisoned = {
valueOf: function() { valueOf: function() {
throw new Test262Error("should not evaluate this code"); throw new Test262Error("should not evaluate this code");
} }

View File

@ -28,19 +28,22 @@ function getReport() {
var value = 42; var value = 42;
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i64a = new BigInt64Array(sab); var i64a = new BigInt64Array(sab);
$262.agent.report(Atomics.store(i64a, 0, ${value})); $262.agent.report(Atomics.store(i64a, 0, ${value}));
$262.agent.report(Atomics.wait(i64a, 0, 0)); $262.agent.report(Atomics.wait(i64a, 0, 0));
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
var i64a = new BigInt64Array(new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)); const i64a = new BigInt64Array(
new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT)
);
$262.agent.broadcast(i64a.buffer); $262.agent.broadcast(i64a.buffer);
$262.agent.sleep(100);
assert.sameValue(getReport(), value.toString()); assert.sameValue(getReport(), value.toString());
assert.sameValue(getReport(), "not-equal"); assert.sameValue(getReport(), 'not-equal');

View File

@ -29,34 +29,39 @@ function getReport() {
} }
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i64a = new BigInt64Array(sab); var i64a = new BigInt64Array(sab);
// Wait on index 0 // Wait on index 0
Atomics.wait(i64a, 0, 0, 200); Atomics.wait(i64a, 0, 0, 200);
$262.agent.report("fail"); $262.agent.report(0);
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i64a = new BigInt64Array(sab); var i64a = new BigInt64Array(sab);
// Wait on index 2 // Wait on index 2
Atomics.wait(i64a, 2, 0, 200); Atomics.wait(i64a, 2, 0, 200);
$262.agent.report("pass"); $262.agent.report(2);
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
var length = 4 * BigInt64Array.BYTES_PER_ELEMENT; const i64a = new BigInt64Array(
var i64a = new BigInt64Array(new SharedArrayBuffer(length)); new SharedArrayBuffer(4 * BigInt64Array.BYTES_PER_ELEMENT)
);
$262.agent.broadcast(i64a.buffer); $262.agent.broadcast(i64a.buffer);
$262.agent.sleep(10); $262.agent.sleep(10);
// Wake index 2 // Wake index 2
Atomics.wake(i64a, 2, 1); Atomics.wake(i64a, 2, 1);
assert.sameValue(getReport(), "2");
// Wake index 0
Atomics.wake(i64a, 2, 1);
assert.sameValue(getReport(), "0");
assert.sameValue(getReport(), "pass");

View File

@ -24,8 +24,7 @@ function getReport() {
return r; return r;
} }
$262.agent.start( $262.agent.start(`
`
var valueOf = { var valueOf = {
valueOf: function() { valueOf: function() {
return false; return false;
@ -49,20 +48,22 @@ $262.agent.receiveBroadcast(function(sab) {
}); });
`); `);
var i32a = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)); const i32a = new Int32Array(
new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)
);
$262.agent.broadcast(i32a.buffer); $262.agent.broadcast(i32a.buffer);
$262.agent.sleep(150); $262.agent.sleep(100);
assert.sameValue(getReport(), 'timed-out'); assert.sameValue(getReport(), 'timed-out');
assert.sameValue(getReport(), 'timed-out'); assert.sameValue(getReport(), 'timed-out');
assert.sameValue(getReport(), 'timed-out'); assert.sameValue(getReport(), 'timed-out');
var timeDiffReport = getReport(); var lapse = getReport();
assert(timeDiffReport >= 0, 'timeout should be a min of 0ms'); assert(lapse >= 0, 'timeout should be a min of 0ms');
assert(timeDiffReport <= $ATOMICS_MAX_TIME_EPSILON, 'timeout should be a max of $$ATOMICS_MAX_TIME_EPSILON'); assert(lapse <= $ATOMICS_MAX_TIME_EPSILON, `timeout should be a max of ${$ATOMICS_MAX_TIME_EPSILON}`);
assert.sameValue(Atomics.wake(i32a, 0), 0); assert.sameValue(Atomics.wake(i32a, 0), 0);

View File

@ -16,16 +16,17 @@ features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray]
flags: [CanBlockIsFalse] flags: [CanBlockIsFalse]
---*/ ---*/
var buffer = new SharedArrayBuffer(1024); const i32a = new Int32Array(
var i32a = new Int32Array(buffer); new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)
);
var valueOf = { const valueOf = {
valueOf: function() { valueOf: function() {
return false; return false;
} }
}; };
var toPrimitive = { const toPrimitive = {
[Symbol.toPrimitive]: function() { [Symbol.toPrimitive]: function() {
return false; return false;
} }

View File

@ -29,25 +29,25 @@ function getReport() {
} }
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i32a = new Int32Array(sab); var i32a = new Int32Array(sab);
// Wait on index 0 // Wait on index 0
Atomics.wait(i32a, 0, 0, 200); Atomics.wait(i32a, 0, 0, 200);
$262.agent.report("fail"); $262.agent.report(0);
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i32a = new Int32Array(sab); var i32a = new Int32Array(sab);
// Wait on index 2 // Wait on index 2
Atomics.wait(i32a, 2, 0, 200); Atomics.wait(i32a, 2, 0, 200);
$262.agent.report("pass"); $262.agent.report(0);
$262.agent.leaving(); $262.agent.leaving();
}); });
`); `);
var length = 4 * Int32Array.BYTES_PER_ELEMENT; var length = 4 * Int32Array.BYTES_PER_ELEMENT;
@ -58,5 +58,8 @@ $262.agent.sleep(10);
// Wake index 2 // Wake index 2
Atomics.wake(i32a, 2, 1); Atomics.wake(i32a, 2, 1);
assert.sameValue(getReport(), '2');
assert.sameValue(getReport(), "pass"); // Wake index 0
Atomics.wake(i32a, 2, 1);
assert.sameValue(getReport(), '0');

View File

@ -23,46 +23,41 @@ function getReport() {
return r; return r;
} }
var agent1 = '1'; const agent1 = '1';
var agent2 = '2'; const agent2 = '2';
var agent3 = '3'; const agent3 = '3';
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i32a = new Int32Array(sab); const i32a = new Int32Array(sab);
$262.agent.report(${agent1}); $262.agent.report(${agent1});
Atomics.wait(i32a, 0, 0); Atomics.wait(i32a, 0, 0);
$262.agent.report(${agent1}); $262.agent.report(${agent1});
$262.agent.leaving();
$262.agent.leaving(); });
});
`); `);
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i32a = new Int32Array(sab); const i32a = new Int32Array(sab);
$262.agent.report(${agent2}); $262.agent.report(${agent2});
Atomics.wait(i32a, 0, 0);
Atomics.wait(i32a, 0, 0); $262.agent.report(${agent2});
$262.agent.report(${agent2}); $262.agent.leaving();
});
$262.agent.leaving();
});
`); `);
$262.agent.start(` $262.agent.start(`
$262.agent.receiveBroadcast(function(sab) { $262.agent.receiveBroadcast(function(sab) {
var i32a = new Int32Array(sab); const i32a = new Int32Array(sab);
$262.agent.report(${agent3}); $262.agent.report(${agent3});
Atomics.wait(i32a, 0, 0);
Atomics.wait(i32a, 0, 0); $262.agent.report(${agent3});
$262.agent.report(${agent3}); $262.agent.leaving();
});
$262.agent.leaving();
});
`); `);