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