tor-browser

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

waitAsync-delete-sab.js (4302B)


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