atomics.js (1847B)
1 // |jit-test| skip-if: !this.SharedArrayBuffer || !this.Atomics 2 3 let gb = 1 * 1024 * 1024 * 1024; 4 let buflen = 4 * gb + 64; 5 let sab = new SharedArrayBuffer(buflen); 6 assertEq(sab.byteLength, buflen); 7 8 function testBasic(base) { 9 var uint8 = new Uint8Array(sab); 10 var uint8Part = new Uint8Array(sab, base, 64); 11 12 for (var i = 0; i < 50; i++) { 13 var index = base + i; 14 uint8Part[i] = 123; 15 assertEq(uint8[index], 123); 16 17 // Binary ops. 18 assertEq(Atomics.add(uint8, index, 1), 123); 19 assertEq(Atomics.and(uint8, index, 0xf), 124); 20 assertEq(Atomics.or(uint8, index, 0xf), 12); 21 assertEq(Atomics.xor(uint8, index, 0xee), 0xf); 22 assertEq(Atomics.sub(uint8, index, 100), 225); 23 assertEq(uint8Part[i], 125); 24 25 // compareExchange. 26 assertEq(Atomics.compareExchange(uint8, index, 125, 90), 125); 27 assertEq(Atomics.compareExchange(uint8, index, 125, 90), 90); 28 assertEq(uint8Part[i], 90); 29 30 // exchange. 31 assertEq(Atomics.exchange(uint8, index, 42), 90); 32 assertEq(uint8Part[i], 42); 33 34 // load/store. 35 assertEq(Atomics.load(uint8, index), 42); 36 assertEq(Atomics.store(uint8, index, 99), 99); 37 assertEq(uint8Part[i], 99); 38 } 39 } 40 for (let i = 0; i <= 4; i++) { 41 testBasic(i * gb); 42 } 43 44 function testWait() { 45 let int32 = new Int32Array(sab); 46 let index = int32.length - 1; 47 assertEq(int32[index], 0); 48 assertEq(Atomics.wait(int32, index, 1), "not-equal"); 49 int32[index] = 12345; 50 assertEq(Atomics.wait(int32, index, 12345, 1), "timed-out"); 51 assertEq(Atomics.notify(int32, index), 0); 52 53 let int32WithOffset = new Int32Array(sab, int32.byteLength - 4); 54 assertEq(int32WithOffset[0], 12345); 55 assertEq(Atomics.wait(int32WithOffset, 0, 12345, 1), "timed-out"); 56 } 57 testWait();