tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

waitAsync.js (3816B)


      1 // |jit-test| --setpref=atomics_wait_async=true; skip-if: helperThreadCount() === 0;
      2 
      3 // Test timing out.
      4 function test1() {
      5  var o = {};
      6  o.sab = new SharedArrayBuffer(4096);
      7  o.ia = new Int32Array(o.sab);
      8  o.ia[37] = 0x1337;
      9 
     10  var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 1).value;
     11  assertEq(!!o.sab, true);
     12  return promise
     13 }
     14 // Test wait and notify.
     15 function test2() {
     16  var o = {};
     17  o.sab = new SharedArrayBuffer(4096);
     18  o.ia = new Int32Array(o.sab);
     19  o.ia[37] = 0x1337;
     20 
     21  var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 100).value;
     22  assertEq(!!o.sab, true);
     23  Atomics.notify(o.ia, 37);
     24  return promise
     25 }
     26 
     27 // Test no timeout and notify.
     28 function test3() {
     29  var o = {};
     30  o.sab = new SharedArrayBuffer(4096);
     31  o.ia = new Int32Array(o.sab);
     32  o.ia[37] = 0x1337;
     33 
     34  var promise = Atomics.waitAsync(o.ia, 37, 0x1337).value;
     35  assertEq(!!o.sab, true);
     36  Atomics.notify(o.ia, 37);
     37  return promise
     38 }
     39 
     40 // Test immediate resolution.
     41 function test4() {
     42  var o = {};
     43  o.sab = new SharedArrayBuffer(4096);
     44  o.ia = new Int32Array(o.sab);
     45  o.ia[37] = 0x1337;
     46 
     47  var v = Atomics.waitAsync(o.ia, 37, 0x1337, 0).value;
     48  assertEq(!!o.sab, true);
     49  return v;
     50 }
     51 
     52 // Store the result of the tests when run in the worker thread.
     53 // Each test increments this value by one if it succeeds
     54 let sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
     55 setSharedObject(sab);
     56 
     57 // same tests as above but with a worker
     58 function test5() {
     59 evalInWorker(`
     60  const i32 = new Int32Array(getSharedObject());
     61  function test1() {
     62    var o = {};
     63    o.sab = new SharedArrayBuffer(4096);
     64    o.ia = new Int32Array(o.sab);
     65    o.ia[37] = 0x1337;
     66 
     67    var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 1).value;
     68    assertEq(!!o.sab, true);
     69    return promise;
     70  }
     71  function test2() {
     72    var o = {};
     73    o.sab = new SharedArrayBuffer(4096);
     74    o.ia = new Int32Array(o.sab);
     75    o.ia[37] = 0x1337;
     76 
     77    var promise = Atomics.waitAsync(o.ia, 37, 0x1337, 100).value;
     78    Atomics.notify(o.ia, 37);
     79    return promise;
     80  }
     81  function test3() {
     82    var o = {};
     83    o.sab = new SharedArrayBuffer(4096);
     84    o.ia = new Int32Array(o.sab);
     85    o.ia[37] = 0x1337;
     86 
     87    var promise = Atomics.waitAsync(o.ia, 37, 0x1337).value;
     88    Atomics.notify(o.ia, 37);
     89    return promise;
     90  }
     91  function test4() {
     92    var o = {};
     93    o.sab = new SharedArrayBuffer(4096);
     94    o.ia = new Int32Array(o.sab);
     95    o.ia[37] = 0x1337;
     96 
     97    var v = Atomics.waitAsync(o.ia, 37, 0x1337, 0).value;
     98    return v;
     99  }
    100 
    101  // Custom Timeout to ensure that we wait until waitAsync times out.
    102  function timeout(n) {
    103    var start = Date.now();
    104    while (Date.now() - start < n) {};
    105  }
    106 
    107  result = "";
    108  test1()
    109    .then((v) => { result = v })
    110 
    111  timeout(10);
    112  drainJobQueue();
    113  if (result == "timed-out") {
    114    Atomics.add(i32, 0, 1);
    115  }
    116  result = "";
    117 
    118  test2()
    119    .then((v) => { result = v })
    120  drainJobQueue();
    121  if (result == "ok") {
    122    Atomics.add(i32, 0, 1);
    123  }
    124  result = "";
    125 
    126  test3()
    127    .then((v) => { result = v })
    128  drainJobQueue();
    129  if (result == "ok") {
    130    Atomics.add(i32, 0, 1);
    131  }
    132  result = "";
    133 
    134  result = test4();
    135  drainJobQueue();
    136  if (result == "timed-out") {
    137    Atomics.add(i32, 0, 1);
    138  }
    139 `);
    140 }
    141 
    142 // Custom Timeout to ensure that we wait until waitAsync times out.
    143 function timeout(n) {
    144  var start = Date.now();
    145  while (Date.now() - start < n) {};
    146 }
    147 
    148 result = "";
    149 test1()
    150  .then((v) => { result = v });
    151 
    152 timeout(10);
    153 drainJobQueue();
    154 assertEq(result, "timed-out");
    155 result = "";
    156 
    157 test2()
    158  .then((v) => { result = v });
    159 drainJobQueue();
    160 assertEq(result, "ok");
    161 result = "";
    162 
    163 test3()
    164  .then((v) => { result = v });
    165 drainJobQueue();
    166 assertEq(result, "ok");
    167 result = "";
    168 
    169 result = test4();
    170 drainJobQueue();
    171 assertEq(result, "timed-out");
    172 
    173 test5();
    174 let i32 = new Int32Array(sab);
    175 while (Atomics.load(i32, 0) != 4) {};