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) {};