Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1534)

Unified Diff: test/mjsunit/harmony/futex.js

Issue 1462833002: Support offset-TypedArray in futex API (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/runtime/runtime-futex.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/harmony/futex.js
diff --git a/test/mjsunit/harmony/futex.js b/test/mjsunit/harmony/futex.js
index 06c0a25ba12121ecb040b22753262cc9d4617979..3a73e0a9b82a5c10cdb7a278b5bc81b948c98980 100644
--- a/test/mjsunit/harmony/futex.js
+++ b/test/mjsunit/harmony/futex.js
@@ -46,7 +46,8 @@
})();
(function TestInvalidIndex() {
- var i32a = new Int32Array(new SharedArrayBuffer(16));
+ var sab = new SharedArrayBuffer(16);
+ var i32a = new Int32Array(sab);
// Valid indexes are 0-3.
[-1, 4, 100].forEach(function(invalidIndex) {
@@ -59,6 +60,16 @@
invalidIndex));
});
+ i32a = new Int32Array(sab, 8);
+ [-1, 2, 100].forEach(function(invalidIndex) {
+ assertEquals(undefined, Atomics.futexWait(i32a, invalidIndex, 0));
+ assertEquals(undefined, Atomics.futexWake(i32a, invalidIndex, 0));
+ var validIndex = 0;
+ assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, invalidIndex, 0, 0,
+ validIndex));
+ assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, validIndex, 0, 0,
+ invalidIndex));
+ });
})();
(function TestWaitTimeout() {
@@ -71,8 +82,13 @@
})();
(function TestWaitNotEqual() {
- var i32a = new Int32Array(new SharedArrayBuffer(16));
+ var sab = new SharedArrayBuffer(16);
+ var i32a = new Int32Array(sab);
assertEquals(Atomics.NOTEQUAL, Atomics.futexWait(i32a, 0, 42));
+
+ i32a = new Int32Array(sab, 8);
+ i32a[0] = 1;
+ assertEquals(Atomics.NOTEQUAL, Atomics.futexWait(i32a, 0, 0));
})();
(function TestWaitNegativeTimeout() {
@@ -90,14 +106,14 @@ if (this.Worker) {
var i32a = new Int32Array(sab);
var workerScript =
- `onmessage = function(sab) {
- var i32a = new Int32Array(sab);
+ `onmessage = function(msg) {
+ var i32a = new Int32Array(msg.sab, msg.offset);
var result = Atomics.futexWait(i32a, 0, 0, ${timeout});
postMessage(result);
};`;
var worker = new Worker(workerScript);
- worker.postMessage(sab, [sab]);
+ worker.postMessage({sab: sab, offset: offset}, [sab]);
// Spin until the worker is waiting on the futex.
while (%AtomicsFutexNumWaitersForTesting(i32a, 0) != 1) {}
@@ -105,6 +121,29 @@ if (this.Worker) {
Atomics.futexWake(i32a, 0, 1);
assertEquals(Atomics.OK, worker.getMessage());
worker.terminate();
+
+ var worker2 = new Worker(workerScript);
+ var offset = 8;
+ var i32a2 = new Int32Array(sab, offset);
+ worker2.postMessage({sab: sab, offset: offset}, [sab]);
+
+ // Spin until the worker is waiting on the futex.
+ while (%AtomicsFutexNumWaitersForTesting(i32a2, 0) != 1) {}
+ Atomics.futexWake(i32a2, 0, 1);
+ assertEquals(Atomics.OK, worker2.getMessage());
+ worker2.terminate();
+
+ // Futex should work when index and buffer views are different, but
+ // the real address is the same.
+ var worker3 = new Worker(workerScript);
+ i32a2 = new Int32Array(sab, 4);
+ worker3.postMessage({sab: sab, offset: 8}, [sab]);
+
+ // Spin until the worker is waiting on the futex.
+ while (%AtomicsFutexNumWaitersForTesting(i32a2, 1) != 1) {}
+ Atomics.futexWake(i32a2, 1, 1);
+ assertEquals(Atomics.OK, worker3.getMessage());
+ worker3.terminate();
};
// Test various infinite timeouts
@@ -266,6 +305,33 @@ if (this.Worker) {
for (id = 0; id < 4; ++id) {
assertEquals(Atomics.OK, workers[id].getMessage());
+ }
+
+ // Test futexWakeOrRequeue on offset typed array
+ var offset = 16;
+ sab = new SharedArrayBuffer(24);
+ i32a = new Int32Array(sab);
+ var i32a2 = new Int32Array(sab, offset);
+
+ for (id = 0; id < 4; id++) {
+ workers[id].postMessage({sab: sab, id: id}, [sab]);
+ }
+
+ while (%AtomicsFutexNumWaitersForTesting(i32a2, 0) != 4) { }
+
+ index1 = 0;
+ index2 = 1;
+ assertEquals(4, %AtomicsFutexNumWaitersForTesting(i32a2, index1));
+ assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a2, index2));
+
+ assertEquals(2, Atomics.futexWakeOrRequeue(i32a2, index1, 2, 0, index2));
+ assertEquals(2, %AtomicsFutexNumWaitersForTesting(i32a2, index2));
+ assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a2, index1));
+
+ assertEquals(2, Atomics.futexWake(i32a2, index2, 2));
+
+ for (id = 0; id < 4; ++id) {
+ assertEquals(Atomics.OK, workers[id].getMessage());
workers[id].terminate();
}
« no previous file with comments | « src/runtime/runtime-futex.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698