diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 36770af4c4..53ec851c4a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -157,6 +157,8 @@ This tag is for boolean properties associated with the test. created procedurally using the project's test generation tool; refer to the section titled "Procedurally-generated tests" for more information on this process +- **`CanBlockIsFalse`** - only run the test when the [[CanBlock]] property of the [Agent Record](https://tc39.github.io/ecma262/#sec-agents) executing the test file is `false` +- **`CanBlockIsTrue`** - only run the test when the [[CanBlock]] property of the [Agent Record](https://tc39.github.io/ecma262/#sec-agents) executing the test file is `true` #### features **features**: [list] @@ -170,7 +172,7 @@ Some tests require the use of language features that are not directly described This tag identifies the section number from the portion of the ECMAScript 5.1 or ECMAScript 3 standard that is tested by this test. It was automatically generated for tests that were originally written for the ES5 (or earlier) version of the test suite and are now part of the ES6 version. You can use the es5id to discover the relevant portion of the ECMAScript standard by looking up the section number in [previous publications of the specification](https://www.ecma-international.org/publications/standards/Ecma-262-arch.htm). Unfortunately, there is no way to identify which version of ECMAScript (specifically, 3 or 5.1) without looking up the section number and deciding whether it covers the observable in the test. -Read the (Test262 Technical Rationale Report)[https://github.com/tc39/test262/wiki/Test262-Technical-Rationale-Report,-October-2017#specification-reference-ids] for reasoning behind deprecation. +Read the [Test262 Technical Rationale Report](https://github.com/tc39/test262/wiki/Test262-Technical-Rationale-Report,-October-2017#specification-reference-ids) for reasoning behind deprecation. #### es6id **es6id**: [es6-test-id] @@ -179,7 +181,7 @@ Read the (Test262 Technical Rationale Report)[https://github.com/tc39/test262/wi This tag identifies the section number from the portion of the ES6 standard that is tested by this test _at the time the test was written_. The es6ids might not correspond to the correction section numbers in the ES6 (or later) specification because routine edits to the specification will change section numbering. For this reason, only the esid is required for new tests. -Read the (Test262 Technical Rationale Report)[https://github.com/tc39/test262/wiki/Test262-Technical-Rationale-Report,-October-2017#specification-reference-ids] for reasoning behind deprecation. +Read the [Test262 Technical Rationale Report](https://github.com/tc39/test262/wiki/Test262-Technical-Rationale-Report,-October-2017#specification-reference-ids) for reasoning behind deprecation. ## Test Environment diff --git a/INTERPRETING.md b/INTERPRETING.md index 4cb7e0cfa6..740ebb16d6 100644 --- a/INTERPRETING.md +++ b/INTERPRETING.md @@ -354,6 +354,30 @@ following strings: test generation tool. This flag is specified for informational purposes only and has no bearing on how the test should be interpreted. +- **`CanBlockIsFalse`** The test file should only be run when the [[CanBlock]] property of the [Agent Record](https://tc39.github.io/ecma262/#sec-agents) executing the file is `false`. + + *Example* + + ```js + /*--- + flags: [CanBlockIsFalse] + ---*/ + var i32 = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)); + assert.throws(TypeError, function() { Atomics.wait(i32, 0, 0, 1000); }); + ``` + +- **`CanBlockIsTrue`** The test file should only be run when the [[CanBlock]] property of the [Agent Record](https://tc39.github.io/ecma262/#sec-agents) executing the file is `true`. + + *Example* + + ```js + /*--- + flags: [CanBlockIsTrue] + ---*/ + var i32 = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)); + Atomics.wait(i32, 0, 0, 1000); // Sleep for one second. + ``` + ### `locale` The `locale` attribute allows tests to declare explicit information regarding locale specificity. Its value is an array of one or more valid language tags or subtags. diff --git a/harness/atomicsHelper.js b/harness/atomicsHelper.js index 0d96813874..31a7361716 100644 --- a/harness/atomicsHelper.js +++ b/harness/atomicsHelper.js @@ -36,19 +36,204 @@ $262.agent.MAX_TIME_EPSILON = 100; }; } /** - * With a given Int32Array, wait until the expected number of agents have reported themselves by - * calling: + * With a given Int32Array or BigInt64Array, wait until the expected number of agents have + * reported themselves by calling: * - * Atomics.add(i32a, index, 1); + * Atomics.add(typedArray, index, 1); * - * @param {Int32Array} i32a An Int32Array with a SharedArrayBuffer - * @param {Number} index The index of which all agents will report. - * @param {Number} expected The number of agents that are expected to report as active. + * @param {(Int32Array|BigInt64Array)} typedArray An Int32Array or BigInt64Array with a SharedArrayBuffer + * @param {number} index The index of which all agents will report. + * @param {number} expected The number of agents that are expected to report as active. */ -$262.agent.waitUntil = function(i32a, index, expected) { - let agents = 0; - while ((agents = Atomics.load(i32a, index)) !== expected) { +$262.agent.waitUntil = function(typedArray, index, expected) { + var agents = 0; + while ((agents = Atomics.load(typedArray, index)) !== expected) { /* nothing */ } - assert.sameValue(agents, expected, `Reporting number of 'agents' equals the value of 'expected' (${expected})`); + assert.sameValue(agents, expected, "Reporting number of 'agents' equals the value of 'expected'"); +}; + +/** + * Timeout values used throughout the Atomics tests. All timeouts are specified in milliseconds. + * + * @property {number} yield Used for `$262.agent.tryYield`. Must not be used in other functions. + * @property {number} small Used when agents will always timeout and `Atomics.wake` is not part + * of the test semantics. Must be larger than `$262.agent.timeouts.yield`. + * @property {number} long Used when some agents may timeout and `Atomics.wake` is called on some + * agents. The agents are required to wait and this needs to be observable + * by the main thread. + * @property {number} huge Used when `Atomics.wake` is called on all waiting agents. The waiting + * must not timeout. The agents are required to wait and this needs to be + * observable by the main thread. All waiting agents must be woken by the + * main thread. + * + * Usage for `$262.agent.timeouts.small`: + * const WAIT_INDEX = 0; + * const RUNNING = 1; + * const TIMEOUT = $262.agent.timeouts.small; + * const i32a = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2)); + * + * $262.agent.start(` + * $262.agent.receiveBroadcast(function(sab) { + * const i32a = new Int32Array(sab); + * Atomics.add(i32a, ${RUNNING}, 1); + * + * $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, ${TIMEOUT})); + * + * $262.agent.leaving(); + * }); + * `); + * $262.agent.broadcast(i32a.buffer); + * + * // Wait until the agent was started and then try to yield control to increase + * // the likelihood the agent has called `Atomics.wait` and is now waiting. + * $262.agent.waitUntil(i32a, RUNNING, 1); + * $262.agent.tryYield(); + * + * // The agent is expected to time out. + * assert.sameValue($262.agent.getReport(), "timed-out"); + * + * + * Usage for `$262.agent.timeouts.long`: + * const WAIT_INDEX = 0; + * const RUNNING = 1; + * const NUMAGENT = 2; + * const TIMEOUT = $262.agent.timeouts.long; + * const i32a = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2)); + * + * for (let i = 0; i < NUMAGENT; i++) { + * $262.agent.start(` + * $262.agent.receiveBroadcast(function(sab) { + * const i32a = new Int32Array(sab); + * Atomics.add(i32a, ${RUNNING}, 1); + * + * $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, ${TIMEOUT})); + * + * $262.agent.leaving(); + * }); + * `); + * } + * $262.agent.broadcast(i32a.buffer); + * + * // Wait until the agents were started and then try to yield control to increase + * // the likelihood the agents have called `Atomics.wait` and are now waiting. + * $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); + * $262.agent.tryYield(); + * + * // Wake exactly one agent. + * assert.sameValue(Atomics.wake(i32a, WAIT_INDEX, 1), 1); + * + * // When it doesn't matter how many agents were woken at once, a while loop + * // can be used to make the test more resilient against intermittent failures + * // in case even though `tryYield` was called, the agents haven't started to + * // wait. + * // + * // // Repeat until exactly one agent was woken. + * // var woken = 0; + * // while ((woken = Atomics.wake(i32a, WAIT_INDEX, 1)) !== 0) ; + * // assert.sameValue(woken, 1); + * + * // One agent was woken and the other one timed out. + * const reports = [$262.agent.getReport(), $262.agent.getReport()]; + * assert(reports.includes("ok")); + * assert(reports.includes("timed-out")); + * + * + * Usage for `$262.agent.timeouts.huge`: + * const WAIT_INDEX = 0; + * const RUNNING = 1; + * const NUMAGENT = 2; + * const TIMEOUT = $262.agent.timeouts.huge; + * const i32a = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2)); + * + * for (let i = 0; i < NUMAGENT; i++) { + * $262.agent.start(` + * $262.agent.receiveBroadcast(function(sab) { + * const i32a = new Int32Array(sab); + * Atomics.add(i32a, ${RUNNING}, 1); + * + * $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, ${TIMEOUT})); + * + * $262.agent.leaving(); + * }); + * `); + * } + * $262.agent.broadcast(i32a.buffer); + * + * // Wait until the agents were started and then try to yield control to increase + * // the likelihood the agents have called `Atomics.wait` and are now waiting. + * $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); + * $262.agent.tryYield(); + * + * // Wake all agents. + * assert.sameValue(Atomics.wake(i32a, WAIT_INDEX), NUMAGENT); + * + * // When it doesn't matter how many agents were woken at once, a while loop + * // can be used to make the test more resilient against intermittent failures + * // in case even though `tryYield` was called, the agents haven't started to + * // wait. + * // + * // // Repeat until all agents were woken. + * // for (var wokenCount = 0; wokenCount < NUMAGENT; ) { + * // var woken = 0; + * // while ((woken = Atomics.wake(i32a, WAIT_INDEX)) !== 0) ; + * // // Maybe perform an action on the woken agents here. + * // wokenCount += woken; + * // } + * + * // All agents were woken and none timeout. + * for (var i = 0; i < NUMAGENT; i++) { + * assert($262.agent.getReport(), "ok"); + * } + */ +$262.agent.timeouts = { + yield: 100, + small: 200, + long: 1000, + huge: 10000, +}; + +/** + * Try to yield control to the agent threads. + * + * Usage: + * const VALUE = 0; + * const RUNNING = 1; + * const i32a = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2)); + * + * $262.agent.start(` + * $262.agent.receiveBroadcast(function(sab) { + * const i32a = new Int32Array(sab); + * Atomics.add(i32a, ${RUNNING}, 1); + * + * Atomics.store(i32a, ${VALUE}, 1); + * + * $262.agent.leaving(); + * }); + * `); + * $262.agent.broadcast(i32a.buffer); + * + * // Wait until agent was started and then try to yield control. + * $262.agent.waitUntil(i32a, RUNNING, 1); + * $262.agent.tryYield(); + * + * // Note: This result is not guaranteed, but should hold in practice most of the time. + * assert.sameValue(Atomics.load(i32a, VALUE), 1); + * + * The default implementation simply waits for `$262.agent.timeouts.yield` milliseconds. + */ +$262.agent.tryYield = function() { + $262.agent.sleep($262.agent.timeouts.yield); +}; + +/** + * Try to sleep the current agent for the given amount of milliseconds. It is acceptable, + * but not encouraged, to ignore this sleep request and directly continue execution. + * + * The default implementation calls `$262.agent.sleep(ms)`. + * + * @param {number} ms Time to sleep in milliseconds. + */ +$262.agent.trySleep = function(ms) { + $262.agent.sleep(ms); }; diff --git a/harness/features.yml b/harness/features.yml index 0e4d950cd2..333af083be 100644 --- a/harness/features.yml +++ b/harness/features.yml @@ -1,6 +1,6 @@ atomicsHelper: [Atomics] typeCoercion.js: [Symbol.toPrimitive, BigInt] -testAtomics.js: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, arrow-function, let, for-of] +testAtomics.js: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] testBigIntTypedArray.js: [BigInt, TypedArray] testTypedArray.js: [TypedArray] isConstructor.js: [Reflect.construct] diff --git a/harness/testAtomics.js b/harness/testAtomics.js index 790773e42b..d5e4fe1e21 100644 --- a/harness/testAtomics.js +++ b/harness/testAtomics.js @@ -15,16 +15,17 @@ description: | */ function testWithAtomicsOutOfBoundsIndices(f) { var bad_indices = [ - (view) => -1, - (view) => view.length, - (view) => view.length * 2, - (view) => Number.POSITIVE_INFINITY, - (view) => Number.NEGATIVE_INFINITY, - (view) => ({ valueOf: () => 125 }), - (view) => ({ toString: () => '125', valueOf: false }) // non-callable valueOf triggers invocation of toString + function(view) { return -1; }, + function(view) { return view.length; }, + function(view) { return view.length * 2; }, + function(view) { return Number.POSITIVE_INFINITY; }, + function(view) { return Number.NEGATIVE_INFINITY; }, + function(view) { return { valueOf: function() { return 125; } }; }, + function(view) { return { toString: function() { return '125'; }, valueOf: false }; }, // non-callable valueOf triggers invocation of toString ]; - for (let IdxGen of bad_indices) { + for (var i = 0; i < bad_indices.length; ++i) { + var IdxGen = bad_indices[i]; try { f(IdxGen); } catch (e) { @@ -45,20 +46,21 @@ function testWithAtomicsOutOfBoundsIndices(f) { function testWithAtomicsInBoundsIndices(f) { // Most of these are eventually coerced to +0 by ToIndex. var good_indices = [ - (view) => 0/-1, - (view) => '-0', - (view) => undefined, - (view) => NaN, - (view) => 0.5, - (view) => '0.5', - (view) => -0.9, - (view) => ({ password: 'qumquat' }), - (view) => view.length - 1, - (view) => ({ valueOf: () => 0 }), - (view) => ({ toString: () => '0', valueOf: false }) // non-callable valueOf triggers invocation of toString + function(view) { return 0/-1; }, + function(view) { return '-0'; }, + function(view) { return undefined; }, + function(view) { return NaN; }, + function(view) { return 0.5; }, + function(view) { return '0.5'; }, + function(view) { return -0.9; }, + function(view) { return { password: 'qumquat' }; }, + function(view) { return view.length - 1; }, + function(view) { return { valueOf: function() { return 0; } }; }, + function(view) { return { toString: function() { return '0'; }, valueOf: false }; }, // non-callable valueOf triggers invocation of toString ]; - for (let IdxGen of good_indices) { + for (var i = 0; i < good_indices.length; ++i) { + var IdxGen = good_indices[i]; try { f(IdxGen); } catch (e) { @@ -94,11 +96,7 @@ function testWithAtomicsNonViewValues(f) { new SharedArrayBuffer(128), new Error('Ouch'), [1,1,2,3,5,8], - ((x) => -x), - new Map(), - new Set(), - new WeakMap(), - new WeakSet(), + function(x) { return -x; }, Symbol('halleluja'), // TODO: Proxy? Object, @@ -108,7 +106,8 @@ function testWithAtomicsNonViewValues(f) { Atomics ]; - for (let nonView of values) { + for (var i = 0; i < values.length; ++i) { + var nonView = values[i]; try { f(nonView); } catch (e) { diff --git a/test/built-ins/Atomics/add/bad-range.js b/test/built-ins/Atomics/add/bad-range.js index e718c447c8..8c582b88ca 100644 --- a/test/built-ins/Atomics/add/bad-range.js +++ b/test/built-ins/Atomics/add/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.add description: > Test range checking of Atomics.add on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/add/bigint/bad-range.js b/test/built-ins/Atomics/add/bigint/bad-range.js index 50dbda674e..979c3f3ef3 100644 --- a/test/built-ins/Atomics/add/bigint/bad-range.js +++ b/test/built-ins/Atomics/add/bigint/bad-range.js @@ -5,7 +5,7 @@ esid: sec-atomics.add description: > Test range checking of Atomics.add on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.add(view, IdxGen(view), 10n); }, '`Atomics.add(view, IdxGen(view), 10n)` throws RangeError'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/add/bigint/good-views.js b/test/built-ins/Atomics/add/bigint/good-views.js index 48168b545c..97644adea5 100644 --- a/test/built-ins/Atomics/add/bigint/good-views.js +++ b/test/built-ins/Atomics/add/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.add description: Test Atomics.add on arrays that allow atomic operations. includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); const ab = new ArrayBuffer(16); diff --git a/test/built-ins/Atomics/add/good-views.js b/test/built-ins/Atomics/add/good-views.js index 9e047fbd4a..ddef527b5a 100644 --- a/test/built-ins/Atomics/add/good-views.js +++ b/test/built-ins/Atomics/add/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.add description: Test Atomics.add on arrays that allow atomic operations. includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/add/non-views.js b/test/built-ins/Atomics/add/non-views.js index 6e5cbbd9a6..cf00d62db7 100644 --- a/test/built-ins/Atomics/add/non-views.js +++ b/test/built-ins/Atomics/add/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.add description: > Test Atomics.add on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/and/bad-range.js b/test/built-ins/Atomics/and/bad-range.js index 9bd37b2fbe..730fd6b560 100644 --- a/test/built-ins/Atomics/and/bad-range.js +++ b/test/built-ins/Atomics/and/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.and description: > Test range checking of Atomics.and on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/and/bigint/bad-range.js b/test/built-ins/Atomics/and/bigint/bad-range.js index eb75e9c687..fc1f190fbf 100644 --- a/test/built-ins/Atomics/and/bigint/bad-range.js +++ b/test/built-ins/Atomics/and/bigint/bad-range.js @@ -5,7 +5,7 @@ esid: sec-atomics.and description: > Test range checking of Atomics.and on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.and(view, IdxGen(view), 10n); }, '`Atomics.and(view, IdxGen(view), 10n)` throws RangeError'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/and/bigint/good-views.js b/test/built-ins/Atomics/and/bigint/good-views.js index 09cad2ce44..901a836f02 100644 --- a/test/built-ins/Atomics/and/bigint/good-views.js +++ b/test/built-ins/Atomics/and/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.and description: Test Atomics.and on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); const ab = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -80,4 +80,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37n); assert.sameValue(Atomics.and(view, Idx, 0n), 37n, 'Atomics.and(view, Idx, 0n) returns 37n'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/and/good-views.js b/test/built-ins/Atomics/and/good-views.js index b1dee33d0f..6bf15d2f18 100644 --- a/test/built-ins/Atomics/and/good-views.js +++ b/test/built-ins/Atomics/and/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.and description: Test Atomics.and on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/and/non-views.js b/test/built-ins/Atomics/and/non-views.js index 4b50141d8f..5915720cdc 100644 --- a/test/built-ins/Atomics/and/non-views.js +++ b/test/built-ins/Atomics/and/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.and description: > Test Atomics.and on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/compareExchange/bad-range.js b/test/built-ins/Atomics/compareExchange/bad-range.js index f4d007db27..1cb3e52785 100644 --- a/test/built-ins/Atomics/compareExchange/bad-range.js +++ b/test/built-ins/Atomics/compareExchange/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.compareexchange description: > Test range checking of Atomics.compareExchange on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/compareExchange/bigint/bad-range.js b/test/built-ins/Atomics/compareExchange/bigint/bad-range.js index ed0929fd87..444c7e62b1 100644 --- a/test/built-ins/Atomics/compareExchange/bigint/bad-range.js +++ b/test/built-ins/Atomics/compareExchange/bigint/bad-range.js @@ -5,7 +5,7 @@ esid: sec-atomics.compareexchange description: > Test range checking of Atomics.compareExchange on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.compareExchange(view, IdxGen(view), 10, 0n); }, '`Atomics.compareExchange(view, IdxGen(view), 10, 0n)` throws RangeError'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/compareExchange/bigint/good-views.js b/test/built-ins/Atomics/compareExchange/bigint/good-views.js index c954bd52ac..38bf6e2b9e 100644 --- a/test/built-ins/Atomics/compareExchange/bigint/good-views.js +++ b/test/built-ins/Atomics/compareExchange/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.compareexchange description: Test Atomics.compareExchange on arrays that allow atomic operations. includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); const ab = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -88,4 +88,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { 'Atomics.compareExchange(view, Idx, 37n, 0n) returns 37n' ); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/compareExchange/good-views.js b/test/built-ins/Atomics/compareExchange/good-views.js index bc9d29af7f..1468eaabf2 100644 --- a/test/built-ins/Atomics/compareExchange/good-views.js +++ b/test/built-ins/Atomics/compareExchange/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.compareexchange description: Test Atomics.compareExchange on arrays that allow atomic operations. includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/compareExchange/non-views.js b/test/built-ins/Atomics/compareExchange/non-views.js index f32827e594..b4a09d43aa 100644 --- a/test/built-ins/Atomics/compareExchange/non-views.js +++ b/test/built-ins/Atomics/compareExchange/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.compareexchange description: > Test Atomics.compareExchange on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/exchange/bad-range.js b/test/built-ins/Atomics/exchange/bad-range.js index 330f3333cc..6f5c8f1749 100644 --- a/test/built-ins/Atomics/exchange/bad-range.js +++ b/test/built-ins/Atomics/exchange/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.exchange description: > Test range checking of Atomics.exchange on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/exchange/bigint/bad-range.js b/test/built-ins/Atomics/exchange/bigint/bad-range.js index b2326d0fa7..9fccbadf8b 100644 --- a/test/built-ins/Atomics/exchange/bigint/bad-range.js +++ b/test/built-ins/Atomics/exchange/bigint/bad-range.js @@ -5,7 +5,7 @@ esid: sec-atomics.exchange description: > Test range checking of Atomics.exchange on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.exchange(view, IdxGen(view), 10n, 0n); }, '`Atomics.exchange(view, IdxGen(view), 10n, 0n)` throws RangeError'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/exchange/bigint/good-views.js b/test/built-ins/Atomics/exchange/bigint/good-views.js index 9c2cacc45b..4d1b149415 100644 --- a/test/built-ins/Atomics/exchange/bigint/good-views.js +++ b/test/built-ins/Atomics/exchange/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.exchange description: Test Atomics.exchange on arrays that allow atomic operations. includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); const ab = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -68,4 +68,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { 'Atomics.exchange(view, Idx, 0n) returns 37n' ); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/exchange/good-views.js b/test/built-ins/Atomics/exchange/good-views.js index c3f63ab9e0..2eeb53bd70 100644 --- a/test/built-ins/Atomics/exchange/good-views.js +++ b/test/built-ins/Atomics/exchange/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.exchange description: Test Atomics.exchange on arrays that allow atomic operations. includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/exchange/non-views.js b/test/built-ins/Atomics/exchange/non-views.js index 20e1acda7e..4c8cdc7275 100644 --- a/test/built-ins/Atomics/exchange/non-views.js +++ b/test/built-ins/Atomics/exchange/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.exchange description: > Test Atomics.exchange on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/load/bad-range.js b/test/built-ins/Atomics/load/bad-range.js index c698ded175..dd0546b10f 100644 --- a/test/built-ins/Atomics/load/bad-range.js +++ b/test/built-ins/Atomics/load/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.load description: > Test range checking of Atomics.load on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/load/bigint/bad-range.js b/test/built-ins/Atomics/load/bigint/bad-range.js index 9da162b6a7..9fa24122af 100644 --- a/test/built-ins/Atomics/load/bigint/bad-range.js +++ b/test/built-ins/Atomics/load/bigint/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.load description: > Test range checking of Atomics.load on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/load/bigint/good-views.js b/test/built-ins/Atomics/load/bigint/good-views.js index bc6824d133..497061084c 100644 --- a/test/built-ins/Atomics/load/bigint/good-views.js +++ b/test/built-ins/Atomics/load/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.load description: Test Atomics.load on arrays that allow atomic operations. includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); const ab = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -45,4 +45,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37n); assert.sameValue(Atomics.load(view, Idx), 37n, 'Atomics.load(view, Idx) returns 37n'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/load/good-views.js b/test/built-ins/Atomics/load/good-views.js index 0f43410a51..f7f3e7ed47 100644 --- a/test/built-ins/Atomics/load/good-views.js +++ b/test/built-ins/Atomics/load/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.load description: Test Atomics.load on arrays that allow atomic operations. includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/load/non-views.js b/test/built-ins/Atomics/load/non-views.js index ac9d0f57a7..98921fc7c9 100644 --- a/test/built-ins/Atomics/load/non-views.js +++ b/test/built-ins/Atomics/load/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.load description: > Test Atomics.load on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/or/bad-range.js b/test/built-ins/Atomics/or/bad-range.js index b3f94b5e34..ac859a9a84 100644 --- a/test/built-ins/Atomics/or/bad-range.js +++ b/test/built-ins/Atomics/or/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.or description: > Test range checking of Atomics.or on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/or/bigint/bad-range.js b/test/built-ins/Atomics/or/bigint/bad-range.js index c8440e9b04..c3f4288123 100644 --- a/test/built-ins/Atomics/or/bigint/bad-range.js +++ b/test/built-ins/Atomics/or/bigint/bad-range.js @@ -5,7 +5,7 @@ esid: sec-atomics.or description: > Test range checking of Atomics.or on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.or(view, IdxGen(view), 10n); }, '`Atomics.or(view, IdxGen(view), 10n)` throws RangeError'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/or/bigint/good-views.js b/test/built-ins/Atomics/or/bigint/good-views.js index fd882a3629..1d0f1e73aa 100644 --- a/test/built-ins/Atomics/or/bigint/good-views.js +++ b/test/built-ins/Atomics/or/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.or description: Test Atomics.or on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); const ab = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -94,4 +94,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.store(view, Idx, 37n); assert.sameValue(Atomics.or(view, Idx, 0n), 37n, 'Atomics.or(view, Idx, 0n) returns 37n'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/or/good-views.js b/test/built-ins/Atomics/or/good-views.js index 7522f1da43..8980353397 100644 --- a/test/built-ins/Atomics/or/good-views.js +++ b/test/built-ins/Atomics/or/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.or description: Test Atomics.or on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/or/non-views.js b/test/built-ins/Atomics/or/non-views.js index 4cebf0f892..5ad0588b88 100644 --- a/test/built-ins/Atomics/or/non-views.js +++ b/test/built-ins/Atomics/or/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.or description: > Test Atomics.or on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/store/bad-range.js b/test/built-ins/Atomics/store/bad-range.js index fd26e25b82..9d67dabdde 100644 --- a/test/built-ins/Atomics/store/bad-range.js +++ b/test/built-ins/Atomics/store/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.store description: > Test range checking of Atomics.store on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/store/bigint/bad-range.js b/test/built-ins/Atomics/store/bigint/bad-range.js index 7cf5180359..41293772bd 100644 --- a/test/built-ins/Atomics/store/bigint/bad-range.js +++ b/test/built-ins/Atomics/store/bigint/bad-range.js @@ -5,7 +5,7 @@ esid: sec-atomics.store description: > Test range checking of Atomics.store on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.store(view, IdxGen(view), 10n); }, '`Atomics.store(view, IdxGen(view), 10n)` throws RangeError'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/store/bigint/good-views.js b/test/built-ins/Atomics/store/bigint/good-views.js index 9940dca4a1..ccd3f168d4 100644 --- a/test/built-ins/Atomics/store/bigint/good-views.js +++ b/test/built-ins/Atomics/store/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.store description: Test Atomics.store on arrays that allow atomic operations. includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ // Make it interesting - use non-zero byteOffsets and non-zero indexes. // In-bounds boundary cases for indexing @@ -15,9 +15,19 @@ testWithBigIntTypedArrayConstructors(function(TA) { const view = new TA(sab, 32, 20); const control = new TA(ab, 0, 2); - for (let val of [10n, -5n, 12345n, 123456789n, BigInt('33'), { - valueOf: () => 33n - }]) { + const values = [ + 10n, + -5n, + 12345n, + 123456789n, + BigInt('33'), + { + valueOf: function() { return 33n; } + } + ]; + + for (let i = 0; i < values.length; i++) { + let val = values[i]; assert.sameValue( Atomics.store(view, 3, val), BigInt(val), diff --git a/test/built-ins/Atomics/store/good-views.js b/test/built-ins/Atomics/store/good-views.js index 43a0c5f56f..086559cf1f 100644 --- a/test/built-ins/Atomics/store/good-views.js +++ b/test/built-ins/Atomics/store/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.store description: Test Atomics.store on arrays that allow atomic operations. includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const sab = new SharedArrayBuffer(1024); @@ -18,17 +18,21 @@ testWithTypedArrayConstructors(function(TA) { const view = new TA(sab, 32, 20); const control = new TA(ab, 0, 2); - for (let val of [10, -5, - 12345, - 123456789, - Math.PI, - "33", - { - valueOf: () => 33 - }, - undefined - ]) - { + const values = [ + 10, + -5, + 12345, + 123456789, + Math.PI, + "33", + { + valueOf: function() { return 33; } + }, + undefined + ]; + + for (let i = 0; i < values.length; i++) { + let val = values[i]; assert.sameValue(Atomics.store(view, 3, val), ToInteger(val), 'Atomics.store(view, 3, val) returns ToInteger(val)'); diff --git a/test/built-ins/Atomics/store/non-views.js b/test/built-ins/Atomics/store/non-views.js index aa0046aeaf..f5159751fc 100644 --- a/test/built-ins/Atomics/store/non-views.js +++ b/test/built-ins/Atomics/store/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.store description: > Test Atomics.store on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/sub/bad-range.js b/test/built-ins/Atomics/sub/bad-range.js index e041a78748..c7444d7772 100644 --- a/test/built-ins/Atomics/sub/bad-range.js +++ b/test/built-ins/Atomics/sub/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.sub description: > Test range checking of Atomics.sub on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/sub/bigint/bad-range.js b/test/built-ins/Atomics/sub/bigint/bad-range.js index 9ca736812f..624c2dfac3 100644 --- a/test/built-ins/Atomics/sub/bigint/bad-range.js +++ b/test/built-ins/Atomics/sub/bigint/bad-range.js @@ -5,7 +5,7 @@ esid: sec-atomics.sub description: > Test range checking of Atomics.sub on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); @@ -17,4 +17,4 @@ testWithBigIntTypedArrayConstructors(function(TA) { Atomics.sub(view, IdxGen(view), 10n); }, '`Atomics.sub(view, IdxGen(view), 10n)` throws RangeError'); }); -}); \ No newline at end of file +}); diff --git a/test/built-ins/Atomics/sub/bigint/good-views.js b/test/built-ins/Atomics/sub/bigint/good-views.js index 37295bcf93..719d4eb634 100644 --- a/test/built-ins/Atomics/sub/bigint/good-views.js +++ b/test/built-ins/Atomics/sub/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.sub description: Test Atomics.sub on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ // Make it interesting - use non-zero byteOffsets and non-zero indexes. // In-bounds boundary cases for indexing diff --git a/test/built-ins/Atomics/sub/good-views.js b/test/built-ins/Atomics/sub/good-views.js index e05c6720c2..c53596f457 100644 --- a/test/built-ins/Atomics/sub/good-views.js +++ b/test/built-ins/Atomics/sub/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.sub description: Test Atomics.sub on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/sub/non-views.js b/test/built-ins/Atomics/sub/non-views.js index 695f021863..9b8abbb293 100644 --- a/test/built-ins/Atomics/sub/non-views.js +++ b/test/built-ins/Atomics/sub/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.sub description: > Test Atomics.sub on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) { diff --git a/test/built-ins/Atomics/wait/bad-range.js b/test/built-ins/Atomics/wait/bad-range.js index 2686441f77..2ee68dced9 100644 --- a/test/built-ins/Atomics/wait/bad-range.js +++ b/test/built-ins/Atomics/wait/bad-range.js @@ -12,7 +12,7 @@ info: | ... includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const i32a = new Int32Array( diff --git a/test/built-ins/Atomics/wait/bigint/bad-range.js b/test/built-ins/Atomics/wait/bigint/bad-range.js index ae0644e618..535933f2fd 100644 --- a/test/built-ins/Atomics/wait/bigint/bad-range.js +++ b/test/built-ins/Atomics/wait/bigint/bad-range.js @@ -12,7 +12,7 @@ info: | ... includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const i64a = new BigInt64Array( diff --git a/test/built-ins/Atomics/wait/bigint/cannot-suspend-throws.js b/test/built-ins/Atomics/wait/bigint/cannot-suspend-throws.js index 05ad9aba09..569330baaa 100644 --- a/test/built-ins/Atomics/wait/bigint/cannot-suspend-throws.js +++ b/test/built-ins/Atomics/wait/bigint/cannot-suspend-throws.js @@ -16,7 +16,8 @@ info: | features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] flags: [CanBlockIsFalse] ---*/ -const i64a = new BigInt64Array(new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8)); + +const i64a = new BigInt64Array(new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4)); assert.throws(TypeError, function() { Atomics.wait(i64a, 0, 0n, 0); diff --git a/test/built-ins/Atomics/wait/bigint/false-for-timeout-agent.js b/test/built-ins/Atomics/wait/bigint/false-for-timeout-agent.js index 54732a390b..a8fd9163db 100644 --- a/test/built-ins/Atomics/wait/bigint/false-for-timeout-agent.js +++ b/test/built-ins/Atomics/wait/bigint/false-for-timeout-agent.js @@ -16,6 +16,8 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` const valueOf = { valueOf: function() { @@ -31,21 +33,31 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); - $262.agent.report(Atomics.wait(i64a, 0, 0n, false)); - $262.agent.report(Atomics.wait(i64a, 0, 0n, valueOf)); - $262.agent.report(Atomics.wait(i64a, 0, 0n, toPrimitive)); - $262.agent.report($262.agent.monotonicNow() - before); + const status1 = Atomics.wait(i64a, 0, 0n, false); + const status2 = Atomics.wait(i64a, 0, 0n, valueOf); + const status3 = Atomics.wait(i64a, 0, 0n, toPrimitive); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(status3); + $262.agent.report(duration); $262.agent.leaving(); }); `); const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(100); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -64,13 +76,9 @@ assert.sameValue( ); const lapse = $262.agent.getReport(); -assert( - lapse >= 0, - 'The result of `(lapse >= 0)` is true' -); -assert( - lapse <= $262.agent.MAX_TIME_EPSILON, - 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true' -); -assert.sameValue(Atomics.wake(i64a, 0), 0, 'Atomics.wake(i64a, 0) returns 0'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); + +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true'); + +assert.sameValue(Atomics.wake(i64a, 0), 0, 'Atomics.wake(i64a, 0) returns 0'); diff --git a/test/built-ins/Atomics/wait/bigint/false-for-timeout.js b/test/built-ins/Atomics/wait/bigint/false-for-timeout.js index b16ac53274..39b0679bea 100644 --- a/test/built-ins/Atomics/wait/bigint/false-for-timeout.js +++ b/test/built-ins/Atomics/wait/bigint/false-for-timeout.js @@ -13,11 +13,11 @@ info: | Boolean -> If argument is true, return 1. If argument is false, return +0. features: [Atomics, BigInt, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] -flags: [CanBlockIsFalse] +flags: [CanBlockIsTrue] ---*/ const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); const valueOf = { @@ -47,4 +47,3 @@ assert.sameValue( "timed-out", 'Atomics.wait(i64a, 0, 0n, toPrimitive) returns "timed-out"' ); - diff --git a/test/built-ins/Atomics/wait/bigint/nan-for-timeout.js b/test/built-ins/Atomics/wait/bigint/nan-for-timeout.js index 04c8343fe3..d3df2ef078 100644 --- a/test/built-ins/Atomics/wait/bigint/nan-for-timeout.js +++ b/test/built-ins/Atomics/wait/bigint/nan-for-timeout.js @@ -17,19 +17,27 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + $262.agent.report(Atomics.wait(i64a, 0, 0n, NaN)); // NaN => +Infinity $262.agent.leaving(); }); `); const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(100); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + assert.sameValue(Atomics.wake(i64a, 0), 1, 'Atomics.wake(i64a, 0) returns 1'); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); diff --git a/test/built-ins/Atomics/wait/bigint/negative-timeout-agent.js b/test/built-ins/Atomics/wait/bigint/negative-timeout-agent.js index cc29f81a6d..f2edf290af 100644 --- a/test/built-ins/Atomics/wait/bigint/negative-timeout-agent.js +++ b/test/built-ins/Atomics/wait/bigint/negative-timeout-agent.js @@ -9,20 +9,28 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab, id) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + $262.agent.report(Atomics.wait(i64a, 0, 0n, -5)); // -5 => 0 $262.agent.leaving(); }); `); const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + assert.sameValue( $262.agent.getReport(), 'timed-out', diff --git a/test/built-ins/Atomics/wait/bigint/negative-timeout.js b/test/built-ins/Atomics/wait/bigint/negative-timeout.js index 35bc0d57f6..d3fe77bfea 100644 --- a/test/built-ins/Atomics/wait/bigint/negative-timeout.js +++ b/test/built-ins/Atomics/wait/bigint/negative-timeout.js @@ -6,11 +6,11 @@ esid: sec-atomics.wait description: > Test that Atomics.wait times out with a negative timeout features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] -flags: [CanBlockIsFalse] +flags: [CanBlockIsTrue] ---*/ const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); assert.sameValue( diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-no-operation.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-no-operation.js index 825283b50b..369e39d93f 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-no-operation.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-no-operation.js @@ -16,24 +16,33 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 500; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + +const i64a = new BigInt64Array( + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) +); + $262.agent.start(` $262.agent.receiveBroadcast(function(sab, id) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); -const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) -); - $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); // NO OPERATION OCCURS HERE! diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-add.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-add.js index 586eec71b7..a1de60a4ab 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-add.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-add.js @@ -6,27 +6,36 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to Add operation includes: [atomicsHelper.js] -features: [ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.add(i64a, 0, 1n); diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-and.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-and.js index 235d7e6574..11a851f474 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-and.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-and.js @@ -5,27 +5,37 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to And operation -includes: [testAtomics.js] -features: [ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +includes: [atomicsHelper.js] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.and(i64a, 0, 1n); diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-compareExchange.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-compareExchange.js index eb0f26e9ba..c7c7e95705 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-compareExchange.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-compareExchange.js @@ -5,27 +5,37 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to compareExchange operation -includes: [testAtomics.js] -features: [Atomics, BigInt, SharedArrayBuffer, TypedArray, ArrayBuffer, DataView, let, arrow-function, for-of] +includes: [atomicsHelper.js] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.compareExchange(i64a, 0, 0n, 1n); diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-exchange.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-exchange.js index d240da3464..3d32007565 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-exchange.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-exchange.js @@ -5,27 +5,37 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to exchange operation -includes: [testAtomics.js] -features: [Atomics, BigInt, SharedArrayBuffer, TypedArray, ArrayBuffer, DataView, let, arrow-function, for-of] +includes: [atomicsHelper.js] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.exchange(i64a, 0, 1n); @@ -40,4 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i64a, 0), 0, 'Atomics.wake(i64a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-or.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-or.js index aa067f04f5..d965025fb9 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-or.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-or.js @@ -5,27 +5,37 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to Or operation -includes: [testAtomics.js] -features: [Atomics, BigInt, SharedArrayBuffer, TypedArray, ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +includes: [atomicsHelper.js] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.or(i64a, 0, 1n); @@ -40,5 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i64a, 0), 0, 'Atomics.wake(i64a, 0) returns 0'); - - diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-store.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-store.js index 2ec1de6984..a3950ad1e7 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-store.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-store.js @@ -5,27 +5,37 @@ esid: sec-atomics.wait description: > Demonstrates that Atomics.store(...) is causing a waiting -includes: [testAtomics.js] -features: [Atomics, BigInt, SharedArrayBuffer, TypedArray, ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +includes: [atomicsHelper.js] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.store(i64a, 0, 0x111111n); @@ -40,4 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i64a, 0), 0, 'Atomics.wake(i64a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-sub.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-sub.js index 163db38f8d..947d38a1ba 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-sub.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-sub.js @@ -5,27 +5,37 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to Sub operation -includes: [testAtomics.js] -features: [Atomics, BigInt, SharedArrayBuffer, TypedArray, ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +includes: [atomicsHelper.js] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.sub(i64a, 0, 1n); diff --git a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-xor.js b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-xor.js index 1da8bb6995..abf0103ff7 100644 --- a/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-xor.js +++ b/test/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-xor.js @@ -5,27 +5,37 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to xor operation -includes: [testAtomics.js] -features: [Atomics, BigInt, SharedArrayBuffer, TypedArray, ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +includes: [atomicsHelper.js] +features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.xor(i64a, 0, 1n); @@ -40,6 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i64a, 0), 0, 'Atomics.wake(i64a, 0) returns 0'); - - - diff --git a/test/built-ins/Atomics/wait/bigint/non-bigint64-typedarray-throws.js b/test/built-ins/Atomics/wait/bigint/non-bigint64-typedarray-throws.js index e6437c19df..9574f9374c 100644 --- a/test/built-ins/Atomics/wait/bigint/non-bigint64-typedarray-throws.js +++ b/test/built-ins/Atomics/wait/bigint/non-bigint64-typedarray-throws.js @@ -19,8 +19,7 @@ info: | a. If typeName is not "BigInt64Array", throw a TypeError exception. -features: [Atomics, BigInt, SharedArrayBuffer, TypedArray, ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] -includes: [testAtomics.js, testBigIntTypedArray.js] +features: [Atomics, BigInt, SharedArrayBuffer] ---*/ const i64a = new BigUint64Array( @@ -40,4 +39,3 @@ assert.throws(TypeError, function() { assert.throws(TypeError, function() { Atomics.wait(i64a, poisoned, poisoned, poisoned); }, '`Atomics.wait(i64a, poisoned, poisoned, poisoned)` throws TypeError'); - diff --git a/test/built-ins/Atomics/wait/bigint/null-bufferdata-throws.js b/test/built-ins/Atomics/wait/bigint/null-bufferdata-throws.js index 2f464a1050..431776621a 100644 --- a/test/built-ins/Atomics/wait/bigint/null-bufferdata-throws.js +++ b/test/built-ins/Atomics/wait/bigint/null-bufferdata-throws.js @@ -26,7 +26,7 @@ features: [ArrayBuffer, Atomics, BigInt, TypedArray] ---*/ const i64a = new BigInt64Array( - new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); const poisoned = { valueOf: function() { diff --git a/test/built-ins/Atomics/wait/bigint/out-of-range-index-throws.js b/test/built-ins/Atomics/wait/bigint/out-of-range-index-throws.js index ee1b2cd5f5..be7ba81e20 100644 --- a/test/built-ins/Atomics/wait/bigint/out-of-range-index-throws.js +++ b/test/built-ins/Atomics/wait/bigint/out-of-range-index-throws.js @@ -17,7 +17,7 @@ features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); const poisoned = { diff --git a/test/built-ins/Atomics/wait/bigint/value-not-equal.js b/test/built-ins/Atomics/wait/bigint/value-not-equal.js index ae4d2ca7d1..9033f1d723 100644 --- a/test/built-ins/Atomics/wait/bigint/value-not-equal.js +++ b/test/built-ins/Atomics/wait/bigint/value-not-equal.js @@ -18,12 +18,15 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + const value = "42n"; $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); - Atomics.add(i64a, 1, 1n); + Atomics.add(i64a, ${RUNNING}, 1n); + $262.agent.report(Atomics.store(i64a, 0, ${value})); $262.agent.report(Atomics.wait(i64a, 0, 0n)); $262.agent.leaving(); @@ -31,11 +34,18 @@ $262.agent.start(` `); const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); +// NB: We don't actually explicitly need to wait for the agent to start in this +// test case, we only do it for consistency with other test cases which do +// require the main agent to wait and yield control. + $262.agent.broadcast(i64a.buffer); -$262.agent.waitUntil(i64a, 1, 1n); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), diff --git a/test/built-ins/Atomics/wait/bigint/waiterlist-block-indexedposition-wake.js b/test/built-ins/Atomics/wait/bigint/waiterlist-block-indexedposition-wake.js index 6718888a16..c45df83d28 100644 --- a/test/built-ins/Atomics/wait/bigint/waiterlist-block-indexedposition-wake.js +++ b/test/built-ins/Atomics/wait/bigint/waiterlist-block-indexedposition-wake.js @@ -22,9 +22,13 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ +var NUMAGENT = 2; +var RUNNING = 4; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); // Wait on index 0 $262.agent.report(Atomics.wait(i64a, 0, 0n, Infinity)); @@ -35,33 +39,37 @@ $262.agent.start(` $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); - // Wait on index 7 - $262.agent.report(Atomics.wait(i64a, 7, 0n, Infinity)); + // Wait on index 2 + $262.agent.report(Atomics.wait(i64a, 2, 0n, Infinity)); $262.agent.leaving(); }); `); const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 5) ); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(10); + +// Wait until all agents started. +$262.agent.waitUntil(i64a, RUNNING, BigInt(NUMAGENT)); // Wake index 1, wakes nothing assert.sameValue(Atomics.wake(i64a, 1), 0, 'Atomics.wake(i64a, 1) returns 0'); + // Wake index 3, wakes nothing assert.sameValue(Atomics.wake(i64a, 3), 0, 'Atomics.wake(i64a, 3) returns 0'); -// Wake index 4, wakes nothing -assert.sameValue(Atomics.wake(i64a, 4), 0, 'Atomics.wake(i64a, 4) returns 0'); -// Wake index 5, wakes nothing -assert.sameValue(Atomics.wake(i64a, 5), 0, 'Atomics.wake(i64a, 5) returns 0'); -// Wake index 7, wakes 1 -assert.sameValue(Atomics.wake(i64a, 7), 1, 'Atomics.wake(i64a, 7) returns 1'); +// Wake index 2, wakes 1 +var woken = 0; +while ((woken = Atomics.wake(i64a, 2)) === 0) ; +assert.sameValue(woken, 1, 'Atomics.wake(i64a, 2) returns 1'); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); // Wake index 0, wakes 1 -assert.sameValue(Atomics.wake(i64a, 0), 1, 'Atomics.wake(i64a, 0) returns 1'); +var woken = 0; +while ((woken = Atomics.wake(i64a, 0)) === 0) ; +assert.sameValue(woken, 1, 'Atomics.wake(i64a, 0) returns 1'); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); diff --git a/test/built-ins/Atomics/wait/bigint/waiterlist-order-of-operations-is-fifo.js b/test/built-ins/Atomics/wait/bigint/waiterlist-order-of-operations-is-fifo.js index f9758bac6a..6c33fba139 100644 --- a/test/built-ins/Atomics/wait/bigint/waiterlist-order-of-operations-is-fifo.js +++ b/test/built-ins/Atomics/wait/bigint/waiterlist-order-of-operations-is-fifo.js @@ -15,75 +15,79 @@ info: | includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -const agent1 = '1'; -const agent2 = '2'; -const agent3 = '3'; -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i64a = new BigInt64Array(sab); +var NUMAGENT = 3; - $262.agent.report(${agent1}); - $262.agent.report(Atomics.wait(i64a, 1, 0n)); - $262.agent.report(${agent1}); - $262.agent.leaving(); - }); -`); +var WAIT_INDEX = 0; +var RUNNING = 1; +var LOCK_INDEX = 2; -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i64a = new BigInt64Array(sab); +for (var i = 0; i < NUMAGENT; i++) { + var agentNum = i; - $262.agent.report(${agent2}); - $262.agent.report(Atomics.wait(i64a, 2, 0n)); - $262.agent.report(${agent2}); - $262.agent.leaving(); - }); -`); + $262.agent.start(` + $262.agent.receiveBroadcast(function(sab) { + const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i64a = new BigInt64Array(sab); + // Synchronize workers before reporting the initial report. + while (Atomics.compareExchange(i64a, ${LOCK_INDEX}, 0n, 1n) !== 0n) ; - $262.agent.report(${agent3}); - $262.agent.report(Atomics.wait(i64a, 3, 0n)); - $262.agent.report(${agent3}); - $262.agent.leaving(); - }); -`); + // Report the agent number before waiting. + $262.agent.report(${agentNum}); + // Wait until restarted by main thread. + var status = Atomics.wait(i64a, ${WAIT_INDEX}, 0n); + + // Report wait status. + $262.agent.report(status); + + // Report the agent number after waiting. + $262.agent.report(${agentNum}); + + $262.agent.leaving(); + }); + `); +} const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(100); -// Agents may be started in any order... -const started = [$262.agent.getReport(), $262.agent.getReport(), $262.agent.getReport()]; +// Wait until all agents started. +$262.agent.waitUntil(i64a, RUNNING, BigInt(NUMAGENT)); -// Agents must wake in the order they waited -assert.sameValue(Atomics.wake(i64a, 1, 1), 1, 'Atomics.wake(i64a, 1, 1) returns 1'); -assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); -assert.sameValue( - $262.agent.getReport(), - started[0], - `$262.agent.getReport() returns the value of 'started[0]' (${started[0]})` -); +// Agents may be started in any order. +const started = []; +for (var i = 0; i < NUMAGENT; i++) { + // Wait until an agent entered its critical section. + $262.agent.waitUntil(i64a, LOCK_INDEX, 1n); -assert.sameValue(Atomics.wake(i64a, 2, 1), 1, 'Atomics.wake(i64a, 2, 1) returns 1'); -assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); -assert.sameValue( - $262.agent.getReport(), - started[1], - `$262.agent.getReport() returns the value of 'started[1]' (${started[1]})` -); + // Record the agent number. + started.push($262.agent.getReport()); -assert.sameValue(Atomics.wake(i64a, 3, 1), 1, 'Atomics.wake(i64a, 3, 1) returns 1'); -assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); -assert.sameValue( - $262.agent.getReport(), - started[2], - `$262.agent.getReport() returns the value of 'started[2]' (${started[2]})` -); + // The agent may have been interrupted between reporting its initial report + // and the `Atomics.wait` call. Try to yield control to ensure the agent + // actually started to wait. + $262.agent.tryYield(); + + // Now continue with the next agent. + Atomics.store(i64a, LOCK_INDEX, 0n); +} + +// Agents must wake in the order they waited. +for (var i = 0; i < NUMAGENT; i++) { + var woken = 0; + while ((woken = Atomics.wake(i64a, WAIT_INDEX, 1)) === 0) ; + + assert.sameValue(woken, 1, + 'Atomics.wake(i64a, WAIT_INDEX, 1) returns 1, at index = ' + i); + + assert.sameValue($262.agent.getReport(), 'ok', + '$262.agent.getReport() returns "ok", at index = ' + i); + + assert.sameValue($262.agent.getReport(), started[i], + '$262.agent.getReport() returns the value of `started[' + i + ']`'); +} diff --git a/test/built-ins/Atomics/wait/bigint/was-woken-before-timeout.js b/test/built-ins/Atomics/wait/bigint/was-woken-before-timeout.js index 48ad7d3abe..829b1479da 100644 --- a/test/built-ins/Atomics/wait/bigint/was-woken-before-timeout.js +++ b/test/built-ins/Atomics/wait/bigint/was-woken-before-timeout.js @@ -22,35 +22,40 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -var sleeping = 10; -var timeout = 20000; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.huge; $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); + Atomics.add(i64a, ${RUNNING}, 1n); + const before = $262.agent.monotonicNow(); - const unpark = Atomics.wait(i64a, 0, 0n, ${timeout}); - $262.agent.report($262.agent.monotonicNow() - before); + const unpark = Atomics.wait(i64a, 0, 0n, ${TIMEOUT}); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); const i64a = new BigInt64Array( - new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 8) + new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 4) ); $262.agent.broadcast(i64a.buffer); -$262.agent.sleep(sleeping); +$262.agent.waitUntil(i64a, RUNNING, 1n); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue(Atomics.wake(i64a, 0), 1, 'Atomics.wake(i64a, 0) returns 1'); const lapse = $262.agent.getReport(); assert( - sleeping + lapse < timeout, - 'The result of `(sleeping + lapse < timeout)` is true' + lapse < TIMEOUT, + 'The result of `(lapse < TIMEOUT)` is true' ); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); - - diff --git a/test/built-ins/Atomics/wait/descriptor.js b/test/built-ins/Atomics/wait/descriptor.js index 550d87b599..58c81cde0a 100644 --- a/test/built-ins/Atomics/wait/descriptor.js +++ b/test/built-ins/Atomics/wait/descriptor.js @@ -13,4 +13,3 @@ verifyProperty(Atomics, 'wait', { writable: true, configurable: true, }); - diff --git a/test/built-ins/Atomics/wait/false-for-timeout-agent.js b/test/built-ins/Atomics/wait/false-for-timeout-agent.js index 85bd22bc85..e2ecf01c3d 100644 --- a/test/built-ins/Atomics/wait/false-for-timeout-agent.js +++ b/test/built-ins/Atomics/wait/false-for-timeout-agent.js @@ -16,6 +16,8 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` const valueOf = { valueOf: function() { @@ -31,11 +33,18 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); - $262.agent.report(Atomics.wait(i32a, 0, 0, false)); - $262.agent.report(Atomics.wait(i32a, 0, 0, valueOf)); - $262.agent.report(Atomics.wait(i32a, 0, 0, toPrimitive)); - $262.agent.report($262.agent.monotonicNow() - before); + const status1 = Atomics.wait(i32a, 0, 0, false); + const status2 = Atomics.wait(i32a, 0, 0, valueOf); + const status3 = Atomics.wait(i32a, 0, 0, toPrimitive); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(status3); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -45,7 +54,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(100); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -63,11 +75,10 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); -var lapse = $262.agent.getReport(); +const lapse = $262.agent.getReport(); -assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); -assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true)'); +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/false-for-timeout.js b/test/built-ins/Atomics/wait/false-for-timeout.js index c008d21f61..e722bceaff 100644 --- a/test/built-ins/Atomics/wait/false-for-timeout.js +++ b/test/built-ins/Atomics/wait/false-for-timeout.js @@ -13,7 +13,7 @@ info: | Boolean -> If argument is true, return 1. If argument is false, return +0. features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] -flags: [CanBlockIsFalse] +flags: [CanBlockIsTrue] ---*/ const i32a = new Int32Array( @@ -47,4 +47,3 @@ assert.sameValue( 'timed-out', 'Atomics.wait(i32a, 0, 0, toPrimitive) returns "timed-out"' ); - diff --git a/test/built-ins/Atomics/wait/good-views.js b/test/built-ins/Atomics/wait/good-views.js index f699c69346..0756b38a16 100644 --- a/test/built-ins/Atomics/wait/good-views.js +++ b/test/built-ins/Atomics/wait/good-views.js @@ -49,13 +49,18 @@ assert.sameValue( 'A timed-out', '$262.agent.getReport() returns "A timed-out"' ); + assert.sameValue( $262.agent.getReport(), 'B not-equal', '$262.agent.getReport() returns "B not-equal"' ); -assert.sameValue( - $262.agent.getReport(), - 'C not-equal', - '$262.agent.getReport() returns "C not-equal"' -); + +var r; +while ((r = $262.agent.getReport()) !== "done") { + assert.sameValue( + r, + 'C not-equal', + '$262.agent.getReport() returns "C not-equal"' + ); +} diff --git a/test/built-ins/Atomics/wait/nan-for-timeout.js b/test/built-ins/Atomics/wait/nan-for-timeout.js index 3a1b109e0d..6b17d7a867 100644 --- a/test/built-ins/Atomics/wait/nan-for-timeout.js +++ b/test/built-ins/Atomics/wait/nan-for-timeout.js @@ -17,9 +17,13 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + $262.agent.report(Atomics.wait(i32a, 0, 0, NaN)); // NaN => +Infinity $262.agent.leaving(); }); @@ -30,7 +34,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(500); // Ample time +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue(Atomics.wake(i32a, 0), 1, 'Atomics.wake(i32a, 0) returns 1'); assert.sameValue($262.agent.getReport(), "ok", '$262.agent.getReport() returns "ok"'); diff --git a/test/built-ins/Atomics/wait/negative-timeout-agent.js b/test/built-ins/Atomics/wait/negative-timeout-agent.js index 15ee04348d..92dca63955 100644 --- a/test/built-ins/Atomics/wait/negative-timeout-agent.js +++ b/test/built-ins/Atomics/wait/negative-timeout-agent.js @@ -9,9 +9,13 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab, id) { var i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + $262.agent.report(Atomics.wait(i32a, 0, 0, -5)); // -5 => 0 $262.agent.leaving(); }); @@ -22,7 +26,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(100); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), diff --git a/test/built-ins/Atomics/wait/negative-timeout.js b/test/built-ins/Atomics/wait/negative-timeout.js index 59c74af2c0..5839f9baa0 100644 --- a/test/built-ins/Atomics/wait/negative-timeout.js +++ b/test/built-ins/Atomics/wait/negative-timeout.js @@ -6,7 +6,7 @@ esid: sec-atomics.wait description: > Test that Atomics.wait times out with a negative timeout features: [Atomics, SharedArrayBuffer, TypedArray] -flags: [CanBlockIsFalse] +flags: [CanBlockIsTrue] ---*/ const i32a = new Int32Array( diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-no-operation.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-no-operation.js new file mode 100644 index 0000000000..e3b05f513b --- /dev/null +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-no-operation.js @@ -0,0 +1,59 @@ +// Copyright (C) 2017 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.wait +description: > + Test that Atomics.wait returns the right result when it timed out and that + the time to time out is reasonable. + info: | + 17. Let awoken be Suspend(WL, W, t). + 18. If awoken is true, then + a. Assert: W is not on the list of waiters in WL. + 19. Else, + a.Perform RemoveWaiter(WL, W). +includes: [atomicsHelper.js] +features: [Atomics, SharedArrayBuffer, TypedArray] +---*/ + +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + +const i32a = new Int32Array( + new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) +); + +$262.agent.start(` + $262.agent.receiveBroadcast(function(sab, id) { + const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + + const before = $262.agent.monotonicNow(); + const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); + $262.agent.report(unpark); + $262.agent.leaving(); + }); +`); + +$262.agent.broadcast(i32a.buffer); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + +// NO OPERATION OCCURS HERE! + +const lapse = $262.agent.getReport(); +assert( + lapse >= TIMEOUT, + 'The result of `(lapse >= TIMEOUT)` is true' +); +assert.sameValue( + $262.agent.getReport(), + 'timed-out', + '$262.agent.getReport() returns "timed-out"' +); +assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-add.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-add.js index 6e43276b66..69a9b5d457 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-add.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-add.js @@ -6,10 +6,12 @@ esid: sec-atomics.wait description: > Waiter does not spuriously wake on index which is subject to Add operation includes: [atomicsHelper.js] -features: [ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.add(i32a, 0, 1); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), @@ -41,5 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - - diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-and.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-and.js index 2d6216185b..94546ce76c 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-and.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-and.js @@ -9,7 +9,9 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.and(i32a, 0, 1); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), @@ -41,5 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - - diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-compareExchange.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-compareExchange.js index d48ad4bf56..63c54cbf2a 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-compareExchange.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-compareExchange.js @@ -9,7 +9,9 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.compareExchange(i32a, 0, 0, 1); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-exchange.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-exchange.js index 11a9cc295f..5aa8061d2f 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-exchange.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-exchange.js @@ -9,7 +9,9 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.exchange(i32a, 0, 1); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), @@ -41,4 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-or.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-or.js index 7e39a50df1..5e65beeb5c 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-or.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-or.js @@ -9,7 +9,9 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.or(i32a, 0, 1); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), @@ -41,5 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - - diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-store.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-store.js index bff44f4f1d..2307a684e3 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-store.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-store.js @@ -9,7 +9,9 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.store(i32a, 0, 0x111111); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), @@ -41,4 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-sub.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-sub.js index 317157442b..d748364b2e 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-sub.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-sub.js @@ -9,7 +9,9 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.sub(i32a, 0, 1); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), diff --git a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-xor.js b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-xor.js index e4e0014373..319d876eaf 100644 --- a/test/built-ins/Atomics/wait/no-spurious-wakeup-on-xor.js +++ b/test/built-ins/Atomics/wait/no-spurious-wakeup-on-xor.js @@ -9,7 +9,9 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const TIMEOUT = 200; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); @@ -17,23 +19,30 @@ const i32a = new Int32Array( $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); `); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); Atomics.xor(i32a, 0, 1); const lapse = $262.agent.getReport(); assert( lapse >= TIMEOUT, - 'The result of `(lapse >= TIMEOUT)` is true (The result of `(lapse >= TIMEOUT)` is true)' + 'The result of `(lapse >= TIMEOUT)` is true' ); assert.sameValue( $262.agent.getReport(), @@ -41,6 +50,3 @@ assert.sameValue( '$262.agent.getReport() returns "timed-out"' ); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - - - diff --git a/test/built-ins/Atomics/wait/null-for-timeout-agent.js b/test/built-ins/Atomics/wait/null-for-timeout-agent.js index e9add11675..2ac79ee924 100644 --- a/test/built-ins/Atomics/wait/null-for-timeout-agent.js +++ b/test/built-ins/Atomics/wait/null-for-timeout-agent.js @@ -16,6 +16,8 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` const valueOf = { valueOf: function() { @@ -31,11 +33,18 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); - $262.agent.report(Atomics.wait(i32a, 0, 0, null)); - $262.agent.report(Atomics.wait(i32a, 0, 0, valueOf)); - $262.agent.report(Atomics.wait(i32a, 0, 0, toPrimitive)); - $262.agent.report($262.agent.monotonicNow() - before); + const status1 = Atomics.wait(i32a, 0, 0, null); + const status2 = Atomics.wait(i32a, 0, 0, valueOf); + const status3 = Atomics.wait(i32a, 0, 0, toPrimitive); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(status3); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -45,7 +54,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -65,9 +77,8 @@ assert.sameValue( const lapse = $262.agent.getReport(); -assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); -assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $262.agent.MAX_TIME_EPSILON))'); +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $262.agent.MAX_TIME_EPSILON)'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/null-for-timeout.js b/test/built-ins/Atomics/wait/null-for-timeout.js index 63068dfb20..b2f2fc2f63 100644 --- a/test/built-ins/Atomics/wait/null-for-timeout.js +++ b/test/built-ins/Atomics/wait/null-for-timeout.js @@ -13,7 +13,7 @@ info: | Null -> Return +0. features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] -flags: [CanBlockIsFalse] +flags: [CanBlockIsTrue] ---*/ const i32a = new Int32Array( @@ -47,4 +47,3 @@ assert.sameValue( "timed-out", 'Atomics.wait(i32a, 0, 0, toPrimitive) returns "timed-out"' ); - diff --git a/test/built-ins/Atomics/wait/object-for-timeout-agent.js b/test/built-ins/Atomics/wait/object-for-timeout-agent.js index 12892f9e90..ba91897915 100644 --- a/test/built-ins/Atomics/wait/object-for-timeout-agent.js +++ b/test/built-ins/Atomics/wait/object-for-timeout-agent.js @@ -15,6 +15,9 @@ info: | includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ + +const RUNNING = 1; + $262.agent.start(` const valueOf = { valueOf: function() { @@ -36,11 +39,18 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); - $262.agent.report(Atomics.wait(i32a, 0, 0, valueOf)); - $262.agent.report(Atomics.wait(i32a, 0, 0, toString)); - $262.agent.report(Atomics.wait(i32a, 0, 0, toPrimitive)); - $262.agent.report($262.agent.monotonicNow() - before); + const status1 = Atomics.wait(i32a, 0, 0, valueOf); + const status2 = Atomics.wait(i32a, 0, 0, toString); + const status3 = Atomics.wait(i32a, 0, 0, toPrimitive); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(status3); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -50,7 +60,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -70,9 +83,8 @@ assert.sameValue( const lapse = $262.agent.getReport(); -assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); -assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON))'); +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON)'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/object-for-timeout.js b/test/built-ins/Atomics/wait/object-for-timeout.js index 4699294d6c..dea53d77c4 100644 --- a/test/built-ins/Atomics/wait/object-for-timeout.js +++ b/test/built-ins/Atomics/wait/object-for-timeout.js @@ -17,7 +17,7 @@ info: | includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] -flags: [CanBlockIsFalse] +flags: [CanBlockIsTrue] ---*/ const i32a = new Int32Array( diff --git a/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws-agent.js b/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws-agent.js index be288ee5f7..a3bb792b78 100644 --- a/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws-agent.js +++ b/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws-agent.js @@ -16,6 +16,8 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` const poisonedValueOf = { valueOf: function() { @@ -31,18 +33,27 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + + let status1 = ""; + let status2 = ""; + const start = $262.agent.monotonicNow(); try { Atomics.wait(i32a, 0, 0, poisonedValueOf); } catch (error) { - $262.agent.report("poisonedValueOf"); + status1 = "poisonedValueOf"; } try { Atomics.wait(i32a, 0, 0, poisonedToPrimitive); } catch (error) { - $262.agent.report("poisonedToPrimitive"); + status2 = "poisonedToPrimitive"; } - $262.agent.report($262.agent.monotonicNow() - start); + const duration = $262.agent.monotonicNow() - start; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -52,7 +63,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -67,9 +81,8 @@ assert.sameValue( const lapse = $262.agent.getReport(); -assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); -assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON))'); +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON)'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/symbol-for-index-throws-agent.js b/test/built-ins/Atomics/wait/symbol-for-index-throws-agent.js index 86e533b3dc..728520ddf0 100644 --- a/test/built-ins/Atomics/wait/symbol-for-index-throws-agent.js +++ b/test/built-ins/Atomics/wait/symbol-for-index-throws-agent.js @@ -29,6 +29,8 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` const poisonedValueOf = { valueOf: function() { @@ -44,18 +46,27 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + + let status1 = ""; + let status2 = ""; + const start = $262.agent.monotonicNow(); try { Atomics.wait(i32a, Symbol("1"), poisonedValueOf, poisonedValueOf); } catch (error) { - $262.agent.report('Symbol("1")'); + status1 = 'Symbol("1")'; } try { Atomics.wait(i32a, Symbol("2"), poisonedToPrimitive, poisonedToPrimitive); } catch (error) { - $262.agent.report('Symbol("2")'); + status2 = 'Symbol("2")'; } - $262.agent.report($262.agent.monotonicNow() - start); + const duration = $262.agent.monotonicNow() - start; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -65,7 +76,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -84,4 +98,3 @@ assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON))'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/symbol-for-timeout-throws-agent.js b/test/built-ins/Atomics/wait/symbol-for-timeout-throws-agent.js index 640cda2060..f745ef583b 100644 --- a/test/built-ins/Atomics/wait/symbol-for-timeout-throws-agent.js +++ b/test/built-ins/Atomics/wait/symbol-for-timeout-throws-agent.js @@ -15,21 +15,33 @@ info: | includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] ---*/ + +const RUNNING = 1; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + + let status1 = ""; + let status2 = ""; + const start = $262.agent.monotonicNow(); try { Atomics.wait(i32a, 0, 0, Symbol("1")); } catch (error) { - $262.agent.report('Symbol("1")'); + status1 = 'Symbol("1")'; } try { Atomics.wait(i32a, 0, 0, Symbol("2")); } catch (error) { - $262.agent.report('Symbol("2")'); + status2 = 'Symbol("2")'; } - $262.agent.report($262.agent.monotonicNow() - start); + const duration = $262.agent.monotonicNow() - start; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -39,7 +51,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -54,7 +69,7 @@ assert.sameValue( const lapse = $262.agent.getReport(); -assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))'); -assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON))'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON)'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); diff --git a/test/built-ins/Atomics/wait/symbol-for-value-throws-agent.js b/test/built-ins/Atomics/wait/symbol-for-value-throws-agent.js index 1206fe1c14..c0e96c3c19 100644 --- a/test/built-ins/Atomics/wait/symbol-for-value-throws-agent.js +++ b/test/built-ins/Atomics/wait/symbol-for-value-throws-agent.js @@ -20,6 +20,8 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` const poisonedValueOf = { valueOf: function() { @@ -35,18 +37,27 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + + let status1 = ""; + let status2 = ""; + const before = $262.agent.monotonicNow(); try { Atomics.wait(i32a, 0, Symbol("1"), poisonedValueOf); } catch (error) { - $262.agent.report('Symbol("1")'); + status1 = 'Symbol("1")'; } try { Atomics.wait(i32a, 0, Symbol("2"), poisonedToPrimitive); } catch (error) { - $262.agent.report('Symbol("2")'); + status2 = 'Symbol("2")'; } - $262.agent.report($262.agent.monotonicNow() - before); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -56,7 +67,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -71,7 +85,7 @@ assert.sameValue( const lapse = $262.agent.getReport(); -assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))'); -assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON))'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON)'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); diff --git a/test/built-ins/Atomics/wait/symbol-for-value-throws.js b/test/built-ins/Atomics/wait/symbol-for-value-throws.js index c414005e67..6fff623482 100644 --- a/test/built-ins/Atomics/wait/symbol-for-value-throws.js +++ b/test/built-ins/Atomics/wait/symbol-for-value-throws.js @@ -50,4 +50,3 @@ assert.throws(TypeError, function() { assert.throws(TypeError, function() { Atomics.wait(i32a, 0, Symbol("foo"), poisonedToPrimitive); }, '`Atomics.wait(i32a, 0, Symbol("foo"), poisonedToPrimitive)` throws TypeError'); - diff --git a/test/built-ins/Atomics/wait/true-for-timeout-agent.js b/test/built-ins/Atomics/wait/true-for-timeout-agent.js index 1b8e090a13..3b2de2ad9f 100644 --- a/test/built-ins/Atomics/wait/true-for-timeout-agent.js +++ b/test/built-ins/Atomics/wait/true-for-timeout-agent.js @@ -16,6 +16,8 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + $262.agent.start(` const valueOf = { valueOf: function() { @@ -31,11 +33,18 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const start = $262.agent.monotonicNow(); - $262.agent.report(Atomics.wait(i32a, 0, 0, true)); - $262.agent.report(Atomics.wait(i32a, 0, 0, valueOf)); - $262.agent.report(Atomics.wait(i32a, 0, 0, toPrimitive)); - $262.agent.report($262.agent.monotonicNow() - start); + const status1 = Atomics.wait(i32a, 0, 0, true); + const status2 = Atomics.wait(i32a, 0, 0, valueOf); + const status3 = Atomics.wait(i32a, 0, 0, toPrimitive); + const duration = $262.agent.monotonicNow() - start; + + $262.agent.report(status1); + $262.agent.report(status2); + $262.agent.report(status3); + $262.agent.report(duration); $262.agent.leaving(); }); `); @@ -45,7 +54,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), @@ -65,9 +77,8 @@ assert.sameValue( const lapse = $262.agent.getReport(); -assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))'); +assert(lapse >= 0, 'The result of `(lapse >= 0)` is true (timeout should be a min of 0ms)'); -assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON))'); +assert(lapse <= $262.agent.MAX_TIME_EPSILON, 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON)'); assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); - diff --git a/test/built-ins/Atomics/wait/true-for-timeout.js b/test/built-ins/Atomics/wait/true-for-timeout.js index 1db2adc508..b850bede87 100644 --- a/test/built-ins/Atomics/wait/true-for-timeout.js +++ b/test/built-ins/Atomics/wait/true-for-timeout.js @@ -13,7 +13,7 @@ info: | Boolean -> If argument is true, return 1. If argument is false, return +0. features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray] -flags: [CanBlockIsFalse] +flags: [CanBlockIsTrue] ---*/ const i32a = new Int32Array( @@ -47,4 +47,3 @@ assert.sameValue( 'timed-out', 'Atomics.wait(i32a, 0, 0, toPrimitive) returns "timed-out"' ); - diff --git a/test/built-ins/Atomics/wait/undefined-for-timeout.js b/test/built-ins/Atomics/wait/undefined-for-timeout.js index 304d40d4ef..4e7cebe7f1 100644 --- a/test/built-ins/Atomics/wait/undefined-for-timeout.js +++ b/test/built-ins/Atomics/wait/undefined-for-timeout.js @@ -25,8 +25,9 @@ const WAKECOUNT = 2; // Total number of agents to wake up $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { var i32a = new Int32Array(sab); - // undefined => NaN => +Infinity Atomics.add(i32a, ${RUNNING}, 1); + + // undefined => NaN => +Infinity $262.agent.report("A " + Atomics.wait(i32a, 0, 0, undefined)); $262.agent.leaving(); }); @@ -35,8 +36,9 @@ $262.agent.start(` $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { var i32a = new Int32Array(sab); - // undefined timeout arg => NaN => +Infinity Atomics.add(i32a, ${RUNNING}, 1); + + // undefined timeout arg => NaN => +Infinity $262.agent.report("B " + Atomics.wait(i32a, 0, 0)); $262.agent.leaving(); }); @@ -49,6 +51,9 @@ const i32a = new Int32Array( $262.agent.broadcast(i32a.buffer); $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + assert.sameValue( Atomics.wake(i32a, WAIT_INDEX, WAKECOUNT), WAKECOUNT, diff --git a/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js b/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js index eff3c7167b..14ba084ced 100644 --- a/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js +++ b/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js @@ -22,10 +22,15 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.long; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); - $262.agent.report(Atomics.wait(i32a, undefined, 0, 1000)); // undefined index => 0 + Atomics.add(i32a, ${RUNNING}, 1); + + $262.agent.report(Atomics.wait(i32a, undefined, 0, ${TIMEOUT})); // undefined index => 0 $262.agent.leaving(); }); `); @@ -35,7 +40,10 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(150); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue(Atomics.wake(i32a, 0), 1, 'Atomics.wake(i32a, 0) returns 1'); // wake at index 0 assert.sameValue(Atomics.wake(i32a, 0), 0, 'Atomics.wake(i32a, 0) returns 0'); // wake again at index 0, and 0 agents should be woken diff --git a/test/built-ins/Atomics/wait/value-not-equal.js b/test/built-ins/Atomics/wait/value-not-equal.js index 3837eef8b7..4c2ca25129 100644 --- a/test/built-ins/Atomics/wait/value-not-equal.js +++ b/test/built-ins/Atomics/wait/value-not-equal.js @@ -18,11 +18,14 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; + var value = 42; $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); $262.agent.report(Atomics.store(i32a, 0, ${value})); $262.agent.report(Atomics.wait(i32a, 0, 0)); @@ -34,8 +37,16 @@ const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); +// NB: We don't actually explicitly need to wait for the agent to start in this +// test case, we only do it for consistency with other test cases which do +// require the main agent to wait and yield control. + $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(100); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + assert.sameValue( $262.agent.getReport(), value.toString(), @@ -46,4 +57,3 @@ assert.sameValue( 'not-equal', '$262.agent.getReport() returns "not-equal"' ); - diff --git a/test/built-ins/Atomics/wait/wait-index-value-not-equal.js b/test/built-ins/Atomics/wait/wait-index-value-not-equal.js index a9a6003f2b..af9d56b603 100644 --- a/test/built-ins/Atomics/wait/wait-index-value-not-equal.js +++ b/test/built-ins/Atomics/wait/wait-index-value-not-equal.js @@ -16,12 +16,16 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.small; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report(Atomics.wait(i32a, 0, 44, 1000)); - $262.agent.report(Atomics.wait(i32a, 0, 251.4, 1000)); + $262.agent.report(Atomics.wait(i32a, 0, 44, ${TIMEOUT})); + $262.agent.report(Atomics.wait(i32a, 0, 251.4, ${TIMEOUT})); $262.agent.leaving(); }); `); @@ -30,8 +34,15 @@ const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); +// NB: We don't actually explicitly need to wait for the agent to start in this +// test case, we only do it for consistency with other test cases which do +// require the main agent to wait and yield control. + $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(100); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue( $262.agent.getReport(), diff --git a/test/built-ins/Atomics/wait/waiterlist-block-indexedposition-wake.js b/test/built-ins/Atomics/wait/waiterlist-block-indexedposition-wake.js index 0d3f0acf00..ba6896cceb 100644 --- a/test/built-ins/Atomics/wait/waiterlist-block-indexedposition-wake.js +++ b/test/built-ins/Atomics/wait/waiterlist-block-indexedposition-wake.js @@ -22,9 +22,13 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +var NUMAGENT = 2; +var RUNNING = 4; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); // Wait on index 0 $262.agent.report(Atomics.wait(i32a, 0, 0, Infinity)); @@ -35,6 +39,7 @@ $262.agent.start(` $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); // Wait on index 2 $262.agent.report(Atomics.wait(i32a, 2, 0, Infinity)); @@ -43,21 +48,28 @@ $262.agent.start(` `); const i32a = new Int32Array( - new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) + new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 5) ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); + +// Wait until all agents started. +$262.agent.waitUntil(i32a, RUNNING, NUMAGENT); // Wake index 1, wakes nothing assert.sameValue(Atomics.wake(i32a, 1), 0, 'Atomics.wake(i32a, 1) returns 0'); + // Wake index 3, wakes nothing assert.sameValue(Atomics.wake(i32a, 3), 0, 'Atomics.wake(i32a, 3) returns 0'); // Wake index 2, wakes 1 -assert.sameValue(Atomics.wake(i32a, 2), 1, 'Atomics.wake(i32a, 2) returns 1'); +var woken = 0; +while ((woken = Atomics.wake(i32a, 2)) === 0) ; +assert.sameValue(woken, 1, 'Atomics.wake(i32a, 2) returns 1'); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); // Wake index 0, wakes 1 -assert.sameValue(Atomics.wake(i32a, 0), 1, 'Atomics.wake(i32a, 0) returns 1'); +var woken = 0; +while ((woken = Atomics.wake(i32a, 0)) === 0) ; +assert.sameValue(woken, 1, 'Atomics.wake(i32a, 0) returns 1'); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); diff --git a/test/built-ins/Atomics/wait/waiterlist-order-of-operations-is-fifo.js b/test/built-ins/Atomics/wait/waiterlist-order-of-operations-is-fifo.js index 11a910e478..81c1030a8a 100644 --- a/test/built-ins/Atomics/wait/waiterlist-order-of-operations-is-fifo.js +++ b/test/built-ins/Atomics/wait/waiterlist-order-of-operations-is-fifo.js @@ -16,75 +16,78 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -var agent1 = '1'; -var agent2 = '2'; -var agent3 = '3'; +var NUMAGENT = 3; -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); +var WAIT_INDEX = 0; +var RUNNING = 1; +var LOCK_INDEX = 2; - $262.agent.report(${agent1}); - $262.agent.report(Atomics.wait(i32a, 1, 0)); - $262.agent.report(${agent1}); - $262.agent.leaving(); - }); -`); +for (var i = 0; i < NUMAGENT; i++) { + var agentNum = i; -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); + $262.agent.start(` + $262.agent.receiveBroadcast(function(sab) { + const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report(${agent2}); - $262.agent.report(Atomics.wait(i32a, 2, 0)); - $262.agent.report(${agent2}); - $262.agent.leaving(); - }); -`); + // Synchronize workers before reporting the initial report. + while (Atomics.compareExchange(i32a, ${LOCK_INDEX}, 0, 1) !== 0) ; -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); + // Report the agent number before waiting. + $262.agent.report(${agentNum}); - $262.agent.report(${agent3}); - $262.agent.report(Atomics.wait(i32a, 3, 0)); - $262.agent.report(${agent3}); - $262.agent.leaving(); - }); -`); + // Wait until restarted by main thread. + var status = Atomics.wait(i32a, ${WAIT_INDEX}, 0); + // Report wait status. + $262.agent.report(status); + + // Report the agent number after waiting. + $262.agent.report(${agentNum}); + + $262.agent.leaving(); + }); + `); +} const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(100); -// Agents may be started in any order... -const started = [$262.agent.getReport(), $262.agent.getReport(), $262.agent.getReport()]; +// Wait until all agents started. +$262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -// Agents must wake in the order they waited -assert.sameValue(Atomics.wake(i32a, 1, 1), 1, 'Atomics.wake(i32a, 1, 1) returns 1'); -assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); -assert.sameValue( - $262.agent.getReport(), - started[0], - '$262.agent.getReport() returns the value of `started[0]` (undefined)' -); +// Agents may be started in any order. +const started = []; +for (var i = 0; i < NUMAGENT; i++) { + // Wait until an agent entered its critical section. + $262.agent.waitUntil(i32a, LOCK_INDEX, 1); -assert.sameValue(Atomics.wake(i32a, 2, 1), 1, 'Atomics.wake(i32a, 2, 1) returns 1'); -assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); -assert.sameValue( - $262.agent.getReport(), - started[1], - '$262.agent.getReport() returns the value of `started[1]` (undefined)' -); + // Record the agent number. + started.push($262.agent.getReport()); -assert.sameValue(Atomics.wake(i32a, 3, 1), 1, 'Atomics.wake(i32a, 3, 1) returns 1'); -assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); -assert.sameValue( - $262.agent.getReport(), - started[2], - '$262.agent.getReport() returns the value of `started[2]` (undefined)' -); + // The agent may have been interrupted between reporting its initial report + // and the `Atomics.wait` call. Try to yield control to ensure the agent + // actually started to wait. + $262.agent.tryYield(); + + // Now continue with the next agent. + Atomics.store(i32a, LOCK_INDEX, 0); +} + +// Agents must wake in the order they waited. +for (var i = 0; i < NUMAGENT; i++) { + var woken = 0; + while ((woken = Atomics.wake(i32a, WAIT_INDEX, 1)) === 0) ; + + assert.sameValue(woken, 1, + 'Atomics.wake(i32a, WAIT_INDEX, 1) returns 1, at index = ' + i); + + assert.sameValue($262.agent.getReport(), 'ok', + '$262.agent.getReport() returns "ok", at index = ' + i); + + assert.sameValue($262.agent.getReport(), started[i], + '$262.agent.getReport() returns the value of `started[' + i + ']`'); +} diff --git a/test/built-ins/Atomics/wait/was-woken-before-timeout.js b/test/built-ins/Atomics/wait/was-woken-before-timeout.js index 24673df84c..d1fa5944e8 100644 --- a/test/built-ins/Atomics/wait/was-woken-before-timeout.js +++ b/test/built-ins/Atomics/wait/was-woken-before-timeout.js @@ -22,15 +22,19 @@ includes: [atomicsHelper.js] features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] ---*/ -var sleeping = 10; -var timeout = 20000; +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.huge; $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); + const before = $262.agent.monotonicNow(); - const unpark = Atomics.wait(i32a, 0, 0, ${timeout}); - $262.agent.report($262.agent.monotonicNow() - before); + const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT}); + const duration = $262.agent.monotonicNow() - before; + + $262.agent.report(duration); $262.agent.report(unpark); $262.agent.leaving(); }); @@ -41,16 +45,17 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(sleeping); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue(Atomics.wake(i32a, 0), 1, 'Atomics.wake(i32a, 0) returns 1'); const lapse = $262.agent.getReport(); assert( - sleeping + lapse < timeout, - 'The result of `(sleeping + lapse < timeout)` is true' + lapse < TIMEOUT, + 'The result of `(lapse < TIMEOUT)` is true' ); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); - - diff --git a/test/built-ins/Atomics/wake/bad-range.js b/test/built-ins/Atomics/wake/bad-range.js index 880ea7fbd2..59a034a1cf 100644 --- a/test/built-ins/Atomics/wake/bad-range.js +++ b/test/built-ins/Atomics/wake/bad-range.js @@ -11,8 +11,8 @@ info: | 1. Let buffer be ? ValidateSharedIntegerTypedArray(typedArray, true). .. -includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +includes: [testAtomics.js] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const i32a = new Int32Array( diff --git a/test/built-ins/Atomics/wake/bigint/bad-range.js b/test/built-ins/Atomics/wake/bigint/bad-range.js index df9340fc84..ae7873733f 100644 --- a/test/built-ins/Atomics/wake/bigint/bad-range.js +++ b/test/built-ins/Atomics/wake/bigint/bad-range.js @@ -12,7 +12,7 @@ info: | .. includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ const i64a = new BigInt64Array( diff --git a/test/built-ins/Atomics/wake/bigint/wake-all-on-loc.js b/test/built-ins/Atomics/wake/bigint/wake-all-on-loc.js index 1c816ad779..f511335c68 100644 --- a/test/built-ins/Atomics/wake/bigint/wake-all-on-loc.js +++ b/test/built-ins/Atomics/wake/bigint/wake-all-on-loc.js @@ -13,14 +13,21 @@ features: [Atomics, BigInt, SharedArrayBuffer, TypedArray] const WAIT_INDEX = 0; // Waiters on this will be woken const WAIT_FAKE = 1; // Waiters on this will not be woken const RUNNING = 2; // Accounting of live agents +const WAKE_INDEX = 3; // Accounting for too early timeouts const NUMAGENT = 3; +const TIMEOUT_AGENT_MESSAGES = 2; // Number of messages for the timeout agent const BUFFER_SIZE = 4; +// Long timeout to ensure the agent doesn't timeout before the main agent calls +// `Atomics.wake`. +const TIMEOUT = $262.agent.timeouts.long; + for (var i = 0; i < NUMAGENT; i++) { $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); Atomics.add(i64a, ${RUNNING}, 1n); + $262.agent.report("A " + Atomics.wait(i64a, ${WAIT_INDEX}, 0n)); $262.agent.leaving(); }); @@ -31,8 +38,17 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i64a = new BigInt64Array(sab); Atomics.add(i64a, ${RUNNING}, 1n); + // This will always time out. - $262.agent.report("B " + Atomics.wait(i64a, ${WAIT_FAKE}, 0n, 10)); + $262.agent.report("B " + Atomics.wait(i64a, ${WAIT_FAKE}, 0n, ${TIMEOUT})); + + // If this value is not 1n, then the agent timeout before the main agent + // called Atomics.wake. + const result = Atomics.load(i64a, ${WAKE_INDEX}) === 1n + ? "timeout after Atomics.wake" + : "timeout before Atomics.wake"; + $262.agent.report("W " + result); + $262.agent.leaving(); }); `); @@ -40,24 +56,27 @@ $262.agent.start(` const i64a = new BigInt64Array( new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * BUFFER_SIZE) ); + $262.agent.broadcast(i64a.buffer); // Wait for agents to be running. -$262.agent.waitUntil(i64a, RUNNING, BigInt(BUFFER_SIZE)); +$262.agent.waitUntil(i64a, RUNNING, BigInt(NUMAGENT + 1)); -// Then wait some more to give the agents a fair chance to wait. If we don't, -// we risk sending the wakeup before agents are sleeping, and we hang. -$262.agent.sleep(50); +// Try to yield control to ensure the agent actually started to wait. If we +// don't, we risk sending the wakeup before agents are sleeping, and we hang. +$262.agent.tryYield(); // Wake all waiting on WAIT_INDEX, should be 3 always, they won't time out. assert.sameValue( Atomics.wake(i64a, WAIT_INDEX), NUMAGENT, - 'Atomics.wake(i64a, WAIT_INDEX) returns the value of `NUMAGENT` (3)' + 'Atomics.wake(i64a, WAIT_INDEX) returns the value of `NUMAGENT`' ); -var reports = []; -for (var i = 0; i < NUMAGENT + 1; i++) { +Atomics.store(i64a, WAKE_INDEX, 1n); + +const reports = []; +for (var i = 0; i < NUMAGENT + TIMEOUT_AGENT_MESSAGES; i++) { reports.push($262.agent.getReport()); } reports.sort(); @@ -66,4 +85,5 @@ for (var i = 0; i < NUMAGENT; i++) { assert.sameValue(reports[i], 'A ok', 'The value of reports[i] is "A ok"'); } assert.sameValue(reports[NUMAGENT], 'B timed-out', 'The value of reports[NUMAGENT] is "B timed-out"'); - +assert.sameValue(reports[NUMAGENT + 1], "W timeout after Atomics.wake", + 'The value of reports[NUMAGENT + 1] is "W timeout after Atomics.wake"'); diff --git a/test/built-ins/Atomics/wake/count-defaults-to-infinity-missing.js b/test/built-ins/Atomics/wake/count-defaults-to-infinity-missing.js index 29601ae79e..d94c98055f 100644 --- a/test/built-ins/Atomics/wake/count-defaults-to-infinity-missing.js +++ b/test/built-ins/Atomics/wake/count-defaults-to-infinity-missing.js @@ -16,61 +16,43 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const RUNNING = 0 -const WAIT_INDEX = 1; // Index all agents are waiting on +const RUNNING = 0; // Index to notify agent has started. +const WAIT_INDEX = 1; // Index all agents are waiting on. +const BUFFER_SIZE = 2; + const NUMAGENT = 4; // Total number of agents started -const BUFFER_SIZE = 5; // Index all agents are waiting on -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("A " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); +for (var i = 0; i < NUMAGENT; i++) { + $262.agent.start(` + $262.agent.receiveBroadcast(function(sab) { + const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("B " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); + // Wait until restarted by main thread. + var status = Atomics.wait(i32a, ${WAIT_INDEX}, 0); -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("C " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); - -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("D " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); + // Report wait status and then exit the agent. + var name = String.fromCharCode(0x41 + ${i}); // "A", "B", "C", or "D" + $262.agent.report(name + " " + status); + $262.agent.leaving(); + }); + `); +} const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * BUFFER_SIZE) ); $262.agent.broadcast(i32a.buffer); - -// Wait for agents to be running. $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX /*, count missing */), - NUMAGENT, - 'Atomics.wake(i32a, WAIT_INDEX /*, count missing */) returns the value of `NUMAGENT` (4)' -); +// An agent may have been interrupted between reporting its initial report +// and the `Atomics.wait` call. Try to yield control to ensure the agent +// actually started to wait. +$262.agent.tryYield(); + +assert.sameValue(Atomics.wake(i32a, WAIT_INDEX /*, count missing */), NUMAGENT, + 'Atomics.wake(i32a, WAIT_INDEX /*, count missing */) returns the value of `NUMAGENT`'); const reports = []; for (var i = 0; i < NUMAGENT; i++) { diff --git a/test/built-ins/Atomics/wake/count-defaults-to-infinity-undefined.js b/test/built-ins/Atomics/wake/count-defaults-to-infinity-undefined.js index be5646351a..c0d2a042d8 100644 --- a/test/built-ins/Atomics/wake/count-defaults-to-infinity-undefined.js +++ b/test/built-ins/Atomics/wake/count-defaults-to-infinity-undefined.js @@ -14,61 +14,43 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const RUNNING = 0 -const WAIT_INDEX = 1; // Index all agents are waiting on +const RUNNING = 0; // Index to notify agent has started. +const WAIT_INDEX = 1; // Index all agents are waiting on. +const BUFFER_SIZE = 2; + const NUMAGENT = 4; // Total number of agents started -const BUFFER_SIZE = 5; // Index all agents are waiting on -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("A " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); +for (var i = 0; i < NUMAGENT; i++) { + $262.agent.start(` + $262.agent.receiveBroadcast(function(sab) { + const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("B " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); + // Wait until restarted by main thread. + var status = Atomics.wait(i32a, ${WAIT_INDEX}, 0); -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("C " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); - -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - $262.agent.report("D " + Atomics.wait(i32a, ${WAIT_INDEX}, 0, 50)); - $262.agent.leaving(); - }); -`); + // Report wait status and then exit the agent. + var name = String.fromCharCode(0x41 + ${i}); // "A", "B", "C", or "D" + $262.agent.report(name + " " + status); + $262.agent.leaving(); + }); + `); +} const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * BUFFER_SIZE) ); $262.agent.broadcast(i32a.buffer); - -// Wait for agents to be running. $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX, undefined), - NUMAGENT, - 'Atomics.wake(i32a, WAIT_INDEX, undefined) returns the value of `NUMAGENT` (4)' -); +// An agent may have been interrupted between reporting its initial report +// and the `Atomics.wait` call. Try to yield control to ensure the agent +// actually started to wait. +$262.agent.tryYield(); + +assert.sameValue(Atomics.wake(i32a, WAIT_INDEX, undefined), NUMAGENT, + 'Atomics.wake(i32a, WAIT_INDEX, undefined) returns the value of `NUMAGENT`'); const reports = []; for (var i = 0; i < NUMAGENT; i++) { diff --git a/test/built-ins/Atomics/wake/negative-count.js b/test/built-ins/Atomics/wake/negative-count.js index 74cf6861c6..49e3b0a752 100644 --- a/test/built-ins/Atomics/wake/negative-count.js +++ b/test/built-ins/Atomics/wake/negative-count.js @@ -9,10 +9,15 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.long; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); - $262.agent.report(Atomics.wait(i32a, 0, 0, 1000)); // Timeout after 1 second + Atomics.add(i32a, ${RUNNING}, 1); + + $262.agent.report(Atomics.wait(i32a, 0, 0, ${TIMEOUT})); $262.agent.leaving(); }); `); @@ -22,7 +27,11 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(500); // Give the agent a chance to wait -assert.sameValue(Atomics.wake(i32a, 0, -1), 0, 'Atomics.wake(i32a, 0, -1) returns 0'); // Don't actually wake it -assert.sameValue($262.agent.getReport(), 'timed-out', '$262.agent.getReport() returns "timed-out"'); +$262.agent.waitUntil(i32a, RUNNING, 1); +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + +assert.sameValue(Atomics.wake(i32a, 0, -1), 0, 'Atomics.wake(i32a, 0, -1) returns 0'); // Don't actually wake it + +assert.sameValue($262.agent.getReport(), 'timed-out', '$262.agent.getReport() returns "timed-out"'); diff --git a/test/built-ins/Atomics/wake/non-views.js b/test/built-ins/Atomics/wake/non-views.js index 5ee2b79e67..76230cc14c 100644 --- a/test/built-ins/Atomics/wake/non-views.js +++ b/test/built-ins/Atomics/wake/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.wake description: > Test Atomics.wake on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(nonView) { diff --git a/test/built-ins/Atomics/wake/undefined-index-defaults-to-zero.js b/test/built-ins/Atomics/wake/undefined-index-defaults-to-zero.js index 917c48c72b..90b0d50067 100644 --- a/test/built-ins/Atomics/wake/undefined-index-defaults-to-zero.js +++ b/test/built-ins/Atomics/wake/undefined-index-defaults-to-zero.js @@ -22,42 +22,52 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - $262.agent.report(Atomics.wait(i32a, 0, 0, 200)); - $262.agent.leaving(); - }); -`); +var WAIT_INDEX = 0; +var RUNNING = 1; -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - $262.agent.report(Atomics.wait(i32a, 0, 0, 200)); - $262.agent.leaving(); - }); -`); +var NUMAGENT = 2; + +for (var i = 0; i < NUMAGENT; i++) { + $262.agent.start(` + $262.agent.receiveBroadcast(function(sab) { + const i32a = new Int32Array(sab); + + // Notify main thread that the agent was started. + Atomics.add(i32a, ${RUNNING}, 1); + + // Wait until restarted by main thread. + var status = Atomics.wait(i32a, ${WAIT_INDEX}, 0); + + // Report wait status. + $262.agent.report(status); + + $262.agent.leaving(); + }); + `); +} const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4) ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(100); // halfway through timeout -// wake at index 0, undefined => 0 -assert.sameValue( - Atomics.wake(i32a, undefined, 1), - 1, - 'Atomics.wake(i32a, undefined, 1) returns 1' -); +// Wait until both agents started. +$262.agent.waitUntil(i32a, RUNNING, NUMAGENT); + +// Try to yield control to ensure the agents actually started to wait. +$262.agent.tryYield(); + +// Wake at index 0, undefined => 0. +var woken = 0; +while ((woken = Atomics.wake(i32a, undefined, 1)) === 0) ; +assert.sameValue(woken, 1, 'Atomics.wake(i32a, undefined, 1) returns 1'); + assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); +// Wake again at index 0, default => 0. +var woken = 0; +while ((woken = Atomics.wake(i32a, /*, default values used */)) === 0) ; +assert.sameValue(woken, 1, 'Atomics.wake(i32a /*, default values used */) returns 1'); -// wake again at index 0, default => 0 -assert.sameValue( - Atomics.wake(i32a /*, default values used */), - 1, - 'Atomics.wake(i32a /*, default values used */) returns 1' -); assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns "ok"'); diff --git a/test/built-ins/Atomics/wake/wake-all-on-loc.js b/test/built-ins/Atomics/wake/wake-all-on-loc.js index aa21761f3e..c874b2c4ed 100644 --- a/test/built-ins/Atomics/wake/wake-all-on-loc.js +++ b/test/built-ins/Atomics/wake/wake-all-on-loc.js @@ -13,14 +13,21 @@ features: [Atomics, SharedArrayBuffer, TypedArray] const WAIT_INDEX = 0; // Waiters on this will be woken const WAIT_FAKE = 1; // Waiters on this will not be woken const RUNNING = 2; // Accounting of live agents +const WAKE_INDEX = 3; // Accounting for too early timeouts const NUMAGENT = 3; +const TIMEOUT_AGENT_MESSAGES = 2; // Number of messages for the timeout agent const BUFFER_SIZE = 4; +// Long timeout to ensure the agent doesn't timeout before the main agent calls +// `Atomics.wake`. +const TIMEOUT = $262.agent.timeouts.long; + for (var i = 0; i < NUMAGENT; i++) { $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); Atomics.add(i32a, ${RUNNING}, 1); + $262.agent.report("A " + Atomics.wait(i32a, ${WAIT_INDEX}, 0)); $262.agent.leaving(); }); @@ -31,8 +38,17 @@ $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); Atomics.add(i32a, ${RUNNING}, 1); + // This will always time out. - $262.agent.report("B " + Atomics.wait(i32a, ${WAIT_FAKE}, 0, 10)); + $262.agent.report("B " + Atomics.wait(i32a, ${WAIT_FAKE}, 0, ${TIMEOUT})); + + // If this value is not 1, then the agent timeout before the main agent + // called Atomics.wake. + const result = Atomics.load(i32a, ${WAKE_INDEX}) === 1 + ? "timeout after Atomics.wake" + : "timeout before Atomics.wake"; + $262.agent.report("W " + result); + $262.agent.leaving(); }); `); @@ -44,21 +60,23 @@ const i32a = new Int32Array( $262.agent.broadcast(i32a.buffer); // Wait for agents to be running. -$262.agent.waitUntil(i32a, RUNNING, BUFFER_SIZE); +$262.agent.waitUntil(i32a, RUNNING, NUMAGENT + 1); -// Then wait some more to give the agents a fair chance to wait. If we don't, -// we risk sending the wakeup before agents are sleeping, and we hang. -$262.agent.sleep(50); +// Try to yield control to ensure the agent actually started to wait. If we +// don't, we risk sending the wakeup before agents are sleeping, and we hang. +$262.agent.tryYield(); // Wake all waiting on WAIT_INDEX, should be 3 always, they won't time out. assert.sameValue( Atomics.wake(i32a, WAIT_INDEX), NUMAGENT, - 'Atomics.wake(i32a, WAIT_INDEX) returns the value of `NUMAGENT` (3)' + 'Atomics.wake(i32a, WAIT_INDEX) returns the value of `NUMAGENT`' ); +Atomics.store(i32a, WAKE_INDEX, 1); + const reports = []; -for (var i = 0; i < NUMAGENT + 1; i++) { +for (var i = 0; i < NUMAGENT + TIMEOUT_AGENT_MESSAGES; i++) { reports.push($262.agent.getReport()); } reports.sort(); @@ -67,3 +85,5 @@ for (var i = 0; i < NUMAGENT; i++) { assert.sameValue(reports[i], "A ok", 'The value of reports[i] is "A ok"'); } assert.sameValue(reports[NUMAGENT], "B timed-out", 'The value of reports[NUMAGENT] is "B timed-out"'); +assert.sameValue(reports[NUMAGENT + 1], "W timeout after Atomics.wake", + 'The value of reports[NUMAGENT + 1] is "W timeout after Atomics.wake"'); diff --git a/test/built-ins/Atomics/wake/wake-all.js b/test/built-ins/Atomics/wake/wake-all.js index eda79a07ed..dfe4c73a2b 100644 --- a/test/built-ins/Atomics/wake/wake-all.js +++ b/test/built-ins/Atomics/wake/wake-all.js @@ -10,8 +10,7 @@ features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ const WAIT_INDEX = 0; // Waiters on this will be woken -const WAIT_FAKE = 1; // Waiters on this will not be woken -const RUNNING = 2; // Accounting of live agents +const RUNNING = 1; // Accounting of live agents const NUMAGENT = 3; const BUFFER_SIZE = 4; @@ -20,22 +19,13 @@ for (var i = 0; i < NUMAGENT; i++) { $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); Atomics.add(i32a, ${RUNNING}, 1); + $262.agent.report("A " + Atomics.wait(i32a, ${WAIT_INDEX}, 0)); $262.agent.leaving(); }); `); } -$262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - // This will always time out. - $262.agent.report("B " + Atomics.wait(i32a, ${WAIT_FAKE}, 0, 10)); - $262.agent.leaving(); - }); -`); - const i32a = new Int32Array( new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * BUFFER_SIZE) ); @@ -43,26 +33,19 @@ const i32a = new Int32Array( $262.agent.broadcast(i32a.buffer); // Wait for agents to be running. -$262.agent.waitUntil(i32a, RUNNING, NUMAGENT + 1); +$262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -// Then wait some more to give the agents a fair chance to wait. If we don't, -// we risk sending the wakeup before agents are sleeping, and we hang. -$262.agent.sleep(50); +// Try to yield control to ensure the agent actually started to wait. If we +// don't, we risk sending the wakeup before agents are sleeping, and we hang. +$262.agent.tryYield(); // Wake all waiting on WAIT_INDEX, should be 3 always, they won't time out. assert.sameValue( Atomics.wake(i32a, WAIT_INDEX), NUMAGENT, - 'Atomics.wake(i32a, WAIT_INDEX) returns the value of `NUMAGENT` (3)' + 'Atomics.wake(i32a, WAIT_INDEX) returns the value of `NUMAGENT`' ); -const reports = []; -for (var i = 0; i < NUMAGENT + 1; i++) { - reports.push($262.agent.getReport()); -} -reports.sort(); - for (var i = 0; i < NUMAGENT; i++) { - assert.sameValue(reports[i], 'A ok', 'The value of reports[i] is "A ok"'); + assert.sameValue($262.agent.getReport(), 'A ok', 'The value of reports[i] is "A ok"'); } -assert.sameValue(reports[NUMAGENT], 'B timed-out', 'The value of reports[NUMAGENT] is "B timed-out"'); diff --git a/test/built-ins/Atomics/wake/wake-in-order-one-time.js b/test/built-ins/Atomics/wake/wake-in-order-one-time.js index 581b738457..dcde6308ae 100644 --- a/test/built-ins/Atomics/wake/wake-in-order-one-time.js +++ b/test/built-ins/Atomics/wake/wake-in-order-one-time.js @@ -24,12 +24,15 @@ for (var i = 0; i < NUMAGENT; i++) { $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); Atomics.add(i32a, ${RUNNING}, 1); + while (Atomics.load(i32a, ${SPIN + i}) === 0) { /* nothing */ } + $262.agent.report(${i}); Atomics.wait(i32a, ${WAIT_INDEX}, 0); $262.agent.report(${i}); + $262.agent.leaving(); }); `); @@ -44,53 +47,30 @@ $262.agent.broadcast(i32a.buffer); // Wait for agents to be running. $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -// Sleep to allow the agents a fair chance to wait. If we don't, -// we risk sending the wakeup before agents are sleeping, and we hang. -$262.agent.sleep(50); - var waiterlist = []; -assert.sameValue( - Atomics.store(i32a, SPIN + 0, 1), - 1, - 'Atomics.store(i32a, SPIN + 0, 1) returns 1' -); -waiterlist.push($262.agent.getReport()); +for (var i = 0; i < NUMAGENT; i++) { + assert.sameValue( + Atomics.store(i32a, SPIN + i, 1), + 1, + `Atomics.store(i32a, SPIN + ${i}, 1) returns 1` + ); -assert.sameValue( - Atomics.store(i32a, SPIN + 1, 1), - 1, - 'Atomics.store(i32a, SPIN + 1, 1) returns 1' -); -waiterlist.push($262.agent.getReport()); + waiterlist.push($262.agent.getReport()); -assert.sameValue( - Atomics.store(i32a, SPIN + 2, 1), - 1, - 'Atomics.store(i32a, SPIN + 2, 1) returns 1' -); -waiterlist.push($262.agent.getReport()); + // Try to yield control to ensure the agent actually started to wait. + $262.agent.tryYield(); +} var notified = []; -assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX, 1), - 1, - 'Atomics.wake(i32a, WAIT_INDEX, 1) returns 1' -); -notified.push($262.agent.getReport()); +for (var i = 0; i < NUMAGENT; i++) { + assert.sameValue( + Atomics.wake(i32a, WAIT_INDEX, 1), + 1, + `Atomics.wake(i32a, WAIT_INDEX, 1) returns 1 (${i})` + ); -assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX, 1), - 1, - 'Atomics.wake(i32a, WAIT_INDEX, 1) returns 1' -); -notified.push($262.agent.getReport()); - -assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX, 1), - 1, - 'Atomics.wake(i32a, WAIT_INDEX, 1) returns 1' -); -notified.push($262.agent.getReport()); + notified.push($262.agent.getReport()); +} assert.sameValue( notified.join(''), diff --git a/test/built-ins/Atomics/wake/wake-in-order.js b/test/built-ins/Atomics/wake/wake-in-order.js index a5de6b8341..dcde6308ae 100644 --- a/test/built-ins/Atomics/wake/wake-in-order.js +++ b/test/built-ins/Atomics/wake/wake-in-order.js @@ -19,83 +19,61 @@ const BUFFER_SIZE = RUNNING + 1; // them go into a wait, thus controlling the waiting order. Then we wake them // one by one and observe the wakeup order. -for (var attempt = 0; attempt < 10; attempt++) { - for (var i = 0; i < NUMAGENT; i++) { - $262.agent.start(` - $262.agent.receiveBroadcast(function(sab) { - const i32a = new Int32Array(sab); - Atomics.add(i32a, ${RUNNING}, 1); - while (Atomics.load(i32a, ${SPIN + i}) === 0) { - /* nothing */ - } - $262.agent.report(${i}); - Atomics.wait(i32a, ${WAIT_INDEX}, 0); - $262.agent.report(${i}); - $262.agent.leaving(); - }); - `); - } +for (var i = 0; i < NUMAGENT; i++) { + $262.agent.start(` + $262.agent.receiveBroadcast(function(sab) { + const i32a = new Int32Array(sab); + Atomics.add(i32a, ${RUNNING}, 1); - const i32a = new Int32Array( - new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * BUFFER_SIZE) - ); + while (Atomics.load(i32a, ${SPIN + i}) === 0) { + /* nothing */ + } - $262.agent.broadcast(i32a.buffer); + $262.agent.report(${i}); + Atomics.wait(i32a, ${WAIT_INDEX}, 0); + $262.agent.report(${i}); - // Wait for agents to be running. - $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); - - // Sleep to allow the agents a fair chance to wait. If we don't, - // we risk sending the wakeup before agents are sleeping, and we hang. - $262.agent.sleep(50); - - var waiterlist = []; - assert.sameValue( - Atomics.store(i32a, SPIN + 0, 1), - 1, - 'Atomics.store(i32a, SPIN + 0, 1) returns 1' - ); - waiterlist.push($262.agent.getReport()); - - assert.sameValue( - Atomics.store(i32a, SPIN + 1, 1), - 1, - 'Atomics.store(i32a, SPIN + 1, 1) returns 1' - ); - waiterlist.push($262.agent.getReport()); - - assert.sameValue( - Atomics.store(i32a, SPIN + 2, 1), - 1, - 'Atomics.store(i32a, SPIN + 2, 1) returns 1' - ); - waiterlist.push($262.agent.getReport()); - - var notified = []; - assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX, 1), - 1, - 'Atomics.wake(i32a, WAIT_INDEX, 1) returns 1' - ); - notified.push($262.agent.getReport()); - - assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX, 1), - 1, - 'Atomics.wake(i32a, WAIT_INDEX, 1) returns 1' - ); - notified.push($262.agent.getReport()); - - assert.sameValue( - Atomics.wake(i32a, WAIT_INDEX, 1), - 1, - 'Atomics.wake(i32a, WAIT_INDEX, 1) returns 1' - ); - notified.push($262.agent.getReport()); - - assert.sameValue( - notified.join(''), - waiterlist.join(''), - 'notified.join(\'\') returns waiterlist.join(\'\')' - ); + $262.agent.leaving(); + }); + `); } + +const i32a = new Int32Array( + new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * BUFFER_SIZE) +); + +$262.agent.broadcast(i32a.buffer); + +// Wait for agents to be running. +$262.agent.waitUntil(i32a, RUNNING, NUMAGENT); + +var waiterlist = []; +for (var i = 0; i < NUMAGENT; i++) { + assert.sameValue( + Atomics.store(i32a, SPIN + i, 1), + 1, + `Atomics.store(i32a, SPIN + ${i}, 1) returns 1` + ); + + waiterlist.push($262.agent.getReport()); + + // Try to yield control to ensure the agent actually started to wait. + $262.agent.tryYield(); +} + +var notified = []; +for (var i = 0; i < NUMAGENT; i++) { + assert.sameValue( + Atomics.wake(i32a, WAIT_INDEX, 1), + 1, + `Atomics.wake(i32a, WAIT_INDEX, 1) returns 1 (${i})` + ); + + notified.push($262.agent.getReport()); +} + +assert.sameValue( + notified.join(''), + waiterlist.join(''), + 'notified.join(\'\') returns waiterlist.join(\'\')' +); diff --git a/test/built-ins/Atomics/wake/wake-nan.js b/test/built-ins/Atomics/wake/wake-nan.js index 7d1e76012a..57a5148114 100644 --- a/test/built-ins/Atomics/wake/wake-nan.js +++ b/test/built-ins/Atomics/wake/wake-nan.js @@ -5,14 +5,19 @@ esid: sec-atomics.wake description: > Test that Atomics.wake wakes zero waiters if the count is NaN -includes: [atomicsHelper.js,testAtomics.js] -features: [ArrayBuffer, DataView, let, arrow-function, for-of, Atomics, BigInt, SharedArrayBuffer, TypedArray] +includes: [atomicsHelper.js] +features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.long; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); - $262.agent.report(Atomics.wait(i32a, 0, 0, 200)); // We will timeout eventually + Atomics.add(i32a, ${RUNNING}, 1); + + $262.agent.report(Atomics.wait(i32a, 0, 0, ${TIMEOUT})); // We will timeout eventually $262.agent.leaving(); }); `); @@ -22,9 +27,14 @@ const i32a = new Int32Array( ); $262.agent.broadcast(i32a.buffer); -$262.agent.sleep(10); // Give the agent a chance to wait +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + assert.sameValue(Atomics.wake(i32a, 0, NaN), 0, 'Atomics.wake(i32a, 0, NaN) returns 0'); -// Sleep past the timeout -$262.agent.sleep(300); +// Try to sleep past the timeout. +$262.agent.trySleep(TIMEOUT); + assert.sameValue($262.agent.getReport(), 'timed-out', '$262.agent.getReport() returns "timed-out"'); diff --git a/test/built-ins/Atomics/wake/wake-one.js b/test/built-ins/Atomics/wake/wake-one.js index 5d6498a477..6ed94793f1 100644 --- a/test/built-ins/Atomics/wake/wake-one.js +++ b/test/built-ins/Atomics/wake/wake-one.js @@ -15,13 +15,16 @@ const WAKECOUNT = 1; const NUMAGENT = 3; const BUFFER_SIZE = 4; +const TIMEOUT = $262.agent.timeouts.long; + for (var i = 0; i < NUMAGENT; i++ ) { $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); Atomics.add(i32a, ${RUNNING}, 1); + // Waiters that are not woken will time out eventually. - $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, 2000)); + $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, ${TIMEOUT})); $262.agent.leaving(); }); `); @@ -36,19 +39,21 @@ $262.agent.broadcast(i32a.buffer); // Wait for agents to be running. $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -// Then wait some more to give the agents a fair chance to wait. If we don't, -// we risk sending the wakeup before agents are sleeping, and we hang. -$262.agent.sleep(10); +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); // There's a slight risk we'll fail to wake the desired count, if the preceding -// sleep() took much longer than anticipated and workers have started timing +// tryYield() took much longer than anticipated and workers have started timing // out. assert.sameValue( Atomics.wake(i32a, 0, WAKECOUNT), WAKECOUNT, - 'Atomics.wake(i32a, 0, WAKECOUNT) returns the value of `WAKECOUNT` (1)' + 'Atomics.wake(i32a, 0, WAKECOUNT) returns the value of `WAKECOUNT`' ); +// Try to sleep past the timeout. +$262.agent.trySleep(TIMEOUT); + // Collect and check results const reports = []; for (var i = 0; i < NUMAGENT; i++) { diff --git a/test/built-ins/Atomics/wake/wake-rewake-noop.js b/test/built-ins/Atomics/wake/wake-rewake-noop.js index 59080e8f4b..4fd24fed9b 100644 --- a/test/built-ins/Atomics/wake/wake-rewake-noop.js +++ b/test/built-ins/Atomics/wake/wake-rewake-noop.js @@ -9,11 +9,15 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ +const RUNNING = 1; +const TIMEOUT = $262.agent.timeouts.long; + $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); - Atomics.add(i32a, 1, 1); - $262.agent.report(Atomics.wait(i32a, 0, 0, 2000)); + Atomics.add(i32a, ${RUNNING}, 1); + + $262.agent.report(Atomics.wait(i32a, 0, 0, ${TIMEOUT})); $262.agent.leaving(); }); `); @@ -24,7 +28,10 @@ const i32a = new Int32Array( $262.agent.broadcast(i32a.buffer); -$262.agent.waitUntil(i32a, 1, 1); +$262.agent.waitUntil(i32a, RUNNING, 1); + +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); assert.sameValue(Atomics.wake(i32a, 0, 1), 1, 'Atomics.wake(i32a, 0, 1) returns 1'); @@ -32,4 +39,3 @@ assert.sameValue($262.agent.getReport(), 'ok', '$262.agent.getReport() returns " // Already awake, this should be a noop assert.sameValue(Atomics.wake(i32a, 0, 1), 0, 'Atomics.wake(i32a, 0, 1) returns 0'); - diff --git a/test/built-ins/Atomics/wake/wake-two.js b/test/built-ins/Atomics/wake/wake-two.js index f318bac1f1..155e9186cc 100644 --- a/test/built-ins/Atomics/wake/wake-two.js +++ b/test/built-ins/Atomics/wake/wake-two.js @@ -9,20 +9,22 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ - const WAIT_INDEX = 0; // Agents wait here const RUNNING = 1; // Accounting of live agents here const WAKECOUNT = 2; const NUMAGENT = 3; const BUFFER_SIZE = 4; +const TIMEOUT = $262.agent.timeouts.long; + for (var i = 0; i < NUMAGENT; i++ ) { $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); Atomics.add(i32a, ${RUNNING}, 1); + // Waiters that are not woken will time out eventually. - $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, 200)); + $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, ${TIMEOUT})); $262.agent.leaving(); }) `); @@ -37,24 +39,23 @@ $262.agent.broadcast(i32a.buffer); // Wait for agents to be running. $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -// Then wait some more to give the agents a fair chance to wait. If we don't, -// we risk sending the wakeup before agents are sleeping, and we hang. -$262.agent.sleep(10); +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); // There's a slight risk we'll fail to wake the desired count, if the preceding -// sleep() took much longer than anticipated and workers have started timing +// tryYield() took much longer than anticipated and workers have started timing // out. assert.sameValue( Atomics.wake(i32a, 0, WAKECOUNT), WAKECOUNT, - 'Atomics.wake(i32a, 0, WAKECOUNT) returns the value of `WAKECOUNT` (2)' + 'Atomics.wake(i32a, 0, WAKECOUNT) returns the value of `WAKECOUNT`' ); -// Sleep past the timeout -$262.agent.sleep(300); +// Try to sleep past the timeout. +$262.agent.trySleep(TIMEOUT); // Collect and check results -var reports = []; +const reports = []; for (var i = 0; i < NUMAGENT; i++) { reports.push($262.agent.getReport()); } @@ -66,4 +67,3 @@ for (var i = 0; i < WAKECOUNT; i++) { for (var i = WAKECOUNT; i < NUMAGENT; i++) { assert.sameValue(reports[i], 'timed-out', 'The value of reports[i] is "timed-out"'); } - diff --git a/test/built-ins/Atomics/wake/wake-zero.js b/test/built-ins/Atomics/wake/wake-zero.js index 85eea4fa11..0808041959 100644 --- a/test/built-ins/Atomics/wake/wake-zero.js +++ b/test/built-ins/Atomics/wake/wake-zero.js @@ -9,19 +9,22 @@ includes: [atomicsHelper.js] features: [Atomics, SharedArrayBuffer, TypedArray] ---*/ -const WAKECOUNT = 0; const WAIT_INDEX = 0; // Agents wait here const RUNNING = 1; // Accounting of live agents here +const WAKECOUNT = 0; const NUMAGENT = 3; const BUFFER_SIZE = 4; +const TIMEOUT = $262.agent.timeouts.long; + for (var i = 0; i < NUMAGENT; i++) { $262.agent.start(` $262.agent.receiveBroadcast(function(sab) { const i32a = new Int32Array(sab); Atomics.add(i32a, ${RUNNING}, 1); + // Waiters that are not woken will time out eventually. - $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, 200)); + $262.agent.report(Atomics.wait(i32a, ${WAIT_INDEX}, 0, ${TIMEOUT})); $262.agent.leaving(); }); `); @@ -36,17 +39,17 @@ $262.agent.broadcast(i32a.buffer); // Wait for agents to be running. $262.agent.waitUntil(i32a, RUNNING, NUMAGENT); -// There's a slight risk we'll fail to wake the desired count, if the preceding -// sleep() took much longer than anticipated and workers have started timing -// out. +// Try to yield control to ensure the agent actually started to wait. +$262.agent.tryYield(); + assert.sameValue( Atomics.wake(i32a, WAIT_INDEX, WAKECOUNT), WAKECOUNT, - 'Atomics.wake(i32a, WAIT_INDEX, WAKECOUNT) returns the value of `WAKECOUNT` (0)' + 'Atomics.wake(i32a, WAIT_INDEX, WAKECOUNT) returns the value of `WAKECOUNT`' ); -// Sleep past the timeout -$262.agent.sleep(300); +// Try to sleep past the timeout. +$262.agent.trySleep(TIMEOUT); for (var i = 0; i < NUMAGENT; i++) { assert.sameValue($262.agent.getReport(), 'timed-out', '$262.agent.getReport() returns "timed-out"'); diff --git a/test/built-ins/Atomics/xor/bad-range.js b/test/built-ins/Atomics/xor/bad-range.js index 49b0c94fc5..09395761ed 100644 --- a/test/built-ins/Atomics/xor/bad-range.js +++ b/test/built-ins/Atomics/xor/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.xor description: > Test range checking of Atomics.xor on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/xor/bigint/bad-range.js b/test/built-ins/Atomics/xor/bigint/bad-range.js index 0cf4eb6269..45a2db5bd9 100644 --- a/test/built-ins/Atomics/xor/bigint/bad-range.js +++ b/test/built-ins/Atomics/xor/bigint/bad-range.js @@ -6,7 +6,7 @@ esid: sec-atomics.xor description: > Test range checking of Atomics.xor on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var buffer = new SharedArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT * 2); diff --git a/test/built-ins/Atomics/xor/bigint/good-views.js b/test/built-ins/Atomics/xor/bigint/good-views.js index 7cf0a8bb2b..59df4d9bb4 100644 --- a/test/built-ins/Atomics/xor/bigint/good-views.js +++ b/test/built-ins/Atomics/xor/bigint/good-views.js @@ -4,7 +4,7 @@ esid: sec-atomics.xor description: Test Atomics.xor on arrays that allow atomic operations includes: [testAtomics.js, testBigIntTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, BigInt, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ // Make it interesting - use non-zero byteOffsets and non-zero indexes. // And again diff --git a/test/built-ins/Atomics/xor/good-views.js b/test/built-ins/Atomics/xor/good-views.js index ba5c582532..cdf1714178 100644 --- a/test/built-ins/Atomics/xor/good-views.js +++ b/test/built-ins/Atomics/xor/good-views.js @@ -5,7 +5,7 @@ esid: sec-atomics.xor description: Test Atomics.xor on arrays that allow atomic operations includes: [testAtomics.js, testTypedArray.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer, TypedArray] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ var sab = new SharedArrayBuffer(1024); diff --git a/test/built-ins/Atomics/xor/non-views.js b/test/built-ins/Atomics/xor/non-views.js index 27963e3f80..d4f4cd77c2 100644 --- a/test/built-ins/Atomics/xor/non-views.js +++ b/test/built-ins/Atomics/xor/non-views.js @@ -6,7 +6,7 @@ esid: sec-atomics.xor description: > Test Atomics.xor on view values other than TypedArrays includes: [testAtomics.js] -features: [ArrayBuffer, arrow-function, Atomics, DataView, for-of, let, SharedArrayBuffer] +features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray] ---*/ testWithAtomicsNonViewValues(function(view) {