diff options
Diffstat (limited to 'deps/v8/test/mjsunit/d8-worker-sharedarraybuffer.js')
-rw-r--r-- | deps/v8/test/mjsunit/d8-worker-sharedarraybuffer.js | 100 |
1 files changed, 69 insertions, 31 deletions
diff --git a/deps/v8/test/mjsunit/d8-worker-sharedarraybuffer.js b/deps/v8/test/mjsunit/d8-worker-sharedarraybuffer.js index 791529fc89..d432f97074 100644 --- a/deps/v8/test/mjsunit/d8-worker-sharedarraybuffer.js +++ b/deps/v8/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. } |