Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2015 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 // Flags: --harmony-sharedarraybuffer
     29 
     30 if (this.Worker) {
     31 
     32   (function TestTransfer() {
     33     var workerScript =
     34       `onmessage = function(m) {
     35        var sab = m;
     36        var ta = new Uint32Array(sab);
     37        if (sab.byteLength !== 16) {
     38          throw new Error('SharedArrayBuffer transfer byteLength');
     39        }
     40        for (var i = 0; i < 4; ++i) {
     41          if (ta[i] !== i) {
     42            throw new Error('SharedArrayBuffer transfer value ' + i);
     43          }
     44        }
     45         // Atomically update ta[0]
     46         Atomics.store(ta, 0, 100);
     47       };`;
     48 
     49     var w = new Worker(workerScript);
     50 
     51     var sab = new SharedArrayBuffer(16);
     52     var ta = new Uint32Array(sab);
     53     for (var i = 0; i < 4; ++i) {
     54       ta[i] = i;
     55     }
     56 
     57     // Transfer SharedArrayBuffer
     58     w.postMessage(sab, [sab]);
     59     assertEquals(16, sab.byteLength);  // ArrayBuffer should not be neutered.
     60 
     61     // Spinwait for the worker to update ta[0]
     62     var ta0;
     63     while ((ta0 = Atomics.load(ta, 0)) == 0) {}
     64 
     65     assertEquals(100, ta0);
     66 
     67     w.terminate();
     68 
     69     assertEquals(16, sab.byteLength);  // Still not neutered.
     70   })();
     71 
     72   (function TestTransferMulti() {
     73     var workerScript =
     74       `onmessage = function(msg) {
     75        var sab = msg.sab;
     76        var id = msg.id;
     77        var ta = new Uint32Array(sab);
     78        Atomics.store(ta, id, 1);
     79        postMessage(id);
     80       };`;
     81 
     82     var sab = new SharedArrayBuffer(16);
     83     var ta = new Uint32Array(sab);
     84 
     85     var id;
     86     var workers = [];
     87     for (id = 0; id < 4; ++id) {
     88       workers[id] = new Worker(workerScript);
     89       workers[id].postMessage({sab: sab, id: id}, [sab]);
     90     }
     91 
     92     // Spinwait for each worker to update ta[id]
     93     var count = 0;
     94     while (count < 4) {
     95       for (id = 0; id < 4; ++id) {
     96         if (Atomics.compareExchange(ta, id, 1, -1) == 1) {
     97           // Worker is finished.
     98           assertEquals(id, workers[id].getMessage());
     99           workers[id].terminate();
    100           count++;
    101         }
    102       }
    103     }
    104   })();
    105 
    106 }
    107