| Index: test/mjsunit/d8-worker-sharedarraybuffer.js
|
| diff --git a/test/mjsunit/d8-worker-sharedarraybuffer.js b/test/mjsunit/d8-worker-sharedarraybuffer.js
|
| index 791529fc89402cfe8b8afcfc3965d7c3bbcd8711..d432f970748486837bd745092bda7e59c7d2bb8e 100644
|
| --- a/test/mjsunit/d8-worker-sharedarraybuffer.js
|
| +++ b/test/mjsunit/d8-worker-sharedarraybuffer.js
|
| @@ -27,42 +27,80 @@
|
|
|
| // Flags: --harmony-sharedarraybuffer --harmony-atomics
|
|
|
| -var workerScript =
|
| - `onmessage = function(m) {
|
| - var sab = m;
|
| - var ta = new Uint32Array(sab);
|
| - if (sab.byteLength !== 16) {
|
| - throw new Error('SharedArrayBuffer transfer byteLength');
|
| - }
|
| - for (var i = 0; i < 4; ++i) {
|
| - if (ta[i] !== i) {
|
| - throw new Error('SharedArrayBuffer transfer value ' + i);
|
| - }
|
| - }
|
| - // Atomically update ta[0]
|
| - Atomics.store(ta, 0, 100);
|
| - };`;
|
| -
|
| if (this.Worker) {
|
| - var w = new Worker(workerScript);
|
|
|
| - var sab = new SharedArrayBuffer(16);
|
| - var ta = new Uint32Array(sab);
|
| - for (var i = 0; i < 4; ++i) {
|
| - ta[i] = i;
|
| - }
|
| + (function TestTransfer() {
|
| + var workerScript =
|
| + `onmessage = function(m) {
|
| + var sab = m;
|
| + var ta = new Uint32Array(sab);
|
| + if (sab.byteLength !== 16) {
|
| + throw new Error('SharedArrayBuffer transfer byteLength');
|
| + }
|
| + for (var i = 0; i < 4; ++i) {
|
| + if (ta[i] !== i) {
|
| + throw new Error('SharedArrayBuffer transfer value ' + i);
|
| + }
|
| + }
|
| + // Atomically update ta[0]
|
| + Atomics.store(ta, 0, 100);
|
| + };`;
|
| +
|
| + var w = new Worker(workerScript);
|
| +
|
| + var sab = new SharedArrayBuffer(16);
|
| + var ta = new Uint32Array(sab);
|
| + for (var i = 0; i < 4; ++i) {
|
| + ta[i] = i;
|
| + }
|
| +
|
| + // Transfer SharedArrayBuffer
|
| + w.postMessage(sab, [sab]);
|
| + assertEquals(16, sab.byteLength); // ArrayBuffer should not be neutered.
|
| +
|
| + // Spinwait for the worker to update ta[0]
|
| + var ta0;
|
| + while ((ta0 = Atomics.load(ta, 0)) == 0) {}
|
| +
|
| + assertEquals(100, ta0);
|
| +
|
| + w.terminate();
|
| +
|
| + assertEquals(16, sab.byteLength); // Still not neutered.
|
| + })();
|
|
|
| - // Transfer SharedArrayBuffer
|
| - w.postMessage(sab, [sab]);
|
| - assertEquals(16, sab.byteLength); // ArrayBuffer should not be neutered.
|
| + (function TestTransferMulti() {
|
| + var workerScript =
|
| + `onmessage = function(msg) {
|
| + var sab = msg.sab;
|
| + var id = msg.id;
|
| + var ta = new Uint32Array(sab);
|
| + Atomics.store(ta, id, 1);
|
| + postMessage(id);
|
| + };`;
|
|
|
| - // Spinwait for the worker to update ta[0]
|
| - var ta0;
|
| - while ((ta0 = Atomics.load(ta, 0)) == 0) {}
|
| + var sab = new SharedArrayBuffer(16);
|
| + var ta = new Uint32Array(sab);
|
|
|
| - assertEquals(100, ta0);
|
| + var id;
|
| + var workers = [];
|
| + for (id = 0; id < 4; ++id) {
|
| + workers[id] = new Worker(workerScript);
|
| + workers[id].postMessage({sab: sab, id: id}, [sab]);
|
| + }
|
|
|
| - w.terminate();
|
| + // Spinwait for each worker to update ta[id]
|
| + var count = 0;
|
| + while (count < 4) {
|
| + for (id = 0; id < 4; ++id) {
|
| + if (Atomics.compareExchange(ta, id, 1, -1) == 1) {
|
| + // Worker is finished.
|
| + assertEquals(id, workers[id].getMessage());
|
| + workers[id].terminate();
|
| + count++;
|
| + }
|
| + }
|
| + }
|
| + })();
|
|
|
| - assertEquals(16, sab.byteLength); // Still not neutered.
|
| }
|
|
|