Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(228)

Side by Side Diff: test/mjsunit/harmony/futex.js

Issue 1462833002: Support offset-TypedArray in futex API (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/runtime/runtime-futex.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Flags: --allow-natives-syntax --harmony-sharedarraybuffer 5 // Flags: --allow-natives-syntax --harmony-sharedarraybuffer
6 6
7 (function TestFailsWithNonSharedArray() { 7 (function TestFailsWithNonSharedArray() {
8 var ab = new ArrayBuffer(16); 8 var ab = new ArrayBuffer(16);
9 9
10 var i8a = new Int8Array(ab); 10 var i8a = new Int8Array(ab);
(...skipping 28 matching lines...) Expand all
39 39
40 [i8a, i16a, ui8a, ui8ca, ui16a, ui32a, f32a, f64a].forEach(function( 40 [i8a, i16a, ui8a, ui8ca, ui16a, ui32a, f32a, f64a].forEach(function(
41 ta) { 41 ta) {
42 assertThrows(function() { Atomics.futexWait(ta, 0, 0); }); 42 assertThrows(function() { Atomics.futexWait(ta, 0, 0); });
43 assertThrows(function() { Atomics.futexWake(ta, 0, 1); }); 43 assertThrows(function() { Atomics.futexWake(ta, 0, 1); });
44 assertThrows(function() { Atomics.futexWakeOrRequeue(ta, 0, 1, 0, 0); }); 44 assertThrows(function() { Atomics.futexWakeOrRequeue(ta, 0, 1, 0, 0); });
45 }); 45 });
46 })(); 46 })();
47 47
48 (function TestInvalidIndex() { 48 (function TestInvalidIndex() {
49 var i32a = new Int32Array(new SharedArrayBuffer(16)); 49 var sab = new SharedArrayBuffer(16);
50 var i32a = new Int32Array(sab);
50 51
51 // Valid indexes are 0-3. 52 // Valid indexes are 0-3.
52 [-1, 4, 100].forEach(function(invalidIndex) { 53 [-1, 4, 100].forEach(function(invalidIndex) {
53 assertEquals(undefined, Atomics.futexWait(i32a, invalidIndex, 0)); 54 assertEquals(undefined, Atomics.futexWait(i32a, invalidIndex, 0));
54 assertEquals(undefined, Atomics.futexWake(i32a, invalidIndex, 0)); 55 assertEquals(undefined, Atomics.futexWake(i32a, invalidIndex, 0));
55 var validIndex = 0; 56 var validIndex = 0;
56 assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, invalidIndex, 0, 0, 57 assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, invalidIndex, 0, 0,
57 validIndex)); 58 validIndex));
58 assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, validIndex, 0, 0, 59 assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, validIndex, 0, 0,
59 invalidIndex)); 60 invalidIndex));
60 }); 61 });
61 62
63 i32a = new Int32Array(sab, 8);
64 [-1, 2, 100].forEach(function(invalidIndex) {
65 assertEquals(undefined, Atomics.futexWait(i32a, invalidIndex, 0));
66 assertEquals(undefined, Atomics.futexWake(i32a, invalidIndex, 0));
67 var validIndex = 0;
68 assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, invalidIndex, 0, 0,
69 validIndex));
70 assertEquals(undefined, Atomics.futexWakeOrRequeue(i32a, validIndex, 0, 0,
71 invalidIndex));
72 });
62 })(); 73 })();
63 74
64 (function TestWaitTimeout() { 75 (function TestWaitTimeout() {
65 var i32a = new Int32Array(new SharedArrayBuffer(16)); 76 var i32a = new Int32Array(new SharedArrayBuffer(16));
66 var waitMs = 100; 77 var waitMs = 100;
67 var startTime = new Date(); 78 var startTime = new Date();
68 assertEquals(Atomics.TIMEDOUT, Atomics.futexWait(i32a, 0, 0, waitMs)); 79 assertEquals(Atomics.TIMEDOUT, Atomics.futexWait(i32a, 0, 0, waitMs));
69 var endTime = new Date(); 80 var endTime = new Date();
70 assertTrue(endTime - startTime >= waitMs); 81 assertTrue(endTime - startTime >= waitMs);
71 })(); 82 })();
72 83
73 (function TestWaitNotEqual() { 84 (function TestWaitNotEqual() {
74 var i32a = new Int32Array(new SharedArrayBuffer(16)); 85 var sab = new SharedArrayBuffer(16);
86 var i32a = new Int32Array(sab);
75 assertEquals(Atomics.NOTEQUAL, Atomics.futexWait(i32a, 0, 42)); 87 assertEquals(Atomics.NOTEQUAL, Atomics.futexWait(i32a, 0, 42));
88
89 i32a = new Int32Array(sab, 8);
90 i32a[0] = 1;
91 assertEquals(Atomics.NOTEQUAL, Atomics.futexWait(i32a, 0, 0));
76 })(); 92 })();
77 93
78 (function TestWaitNegativeTimeout() { 94 (function TestWaitNegativeTimeout() {
79 var i32a = new Int32Array(new SharedArrayBuffer(16)); 95 var i32a = new Int32Array(new SharedArrayBuffer(16));
80 assertEquals(Atomics.TIMEDOUT, Atomics.futexWait(i32a, 0, 0, -1)); 96 assertEquals(Atomics.TIMEDOUT, Atomics.futexWait(i32a, 0, 0, -1));
81 assertEquals(Atomics.TIMEDOUT, Atomics.futexWait(i32a, 0, 0, -Infinity)); 97 assertEquals(Atomics.TIMEDOUT, Atomics.futexWait(i32a, 0, 0, -Infinity));
82 })(); 98 })();
83 99
84 //// WORKER ONLY TESTS 100 //// WORKER ONLY TESTS
85 101
86 if (this.Worker) { 102 if (this.Worker) {
87 103
88 var TestWaitWithTimeout = function(timeout) { 104 var TestWaitWithTimeout = function(timeout) {
89 var sab = new SharedArrayBuffer(16); 105 var sab = new SharedArrayBuffer(16);
90 var i32a = new Int32Array(sab); 106 var i32a = new Int32Array(sab);
91 107
92 var workerScript = 108 var workerScript =
93 `onmessage = function(sab) { 109 `onmessage = function(msg) {
94 var i32a = new Int32Array(sab); 110 var i32a = new Int32Array(msg.sab, msg.offset);
95 var result = Atomics.futexWait(i32a, 0, 0, ${timeout}); 111 var result = Atomics.futexWait(i32a, 0, 0, ${timeout});
96 postMessage(result); 112 postMessage(result);
97 };`; 113 };`;
98 114
99 var worker = new Worker(workerScript); 115 var worker = new Worker(workerScript);
100 worker.postMessage(sab, [sab]); 116 worker.postMessage({sab: sab, offset: offset}, [sab]);
101 117
102 // Spin until the worker is waiting on the futex. 118 // Spin until the worker is waiting on the futex.
103 while (%AtomicsFutexNumWaitersForTesting(i32a, 0) != 1) {} 119 while (%AtomicsFutexNumWaitersForTesting(i32a, 0) != 1) {}
104 120
105 Atomics.futexWake(i32a, 0, 1); 121 Atomics.futexWake(i32a, 0, 1);
106 assertEquals(Atomics.OK, worker.getMessage()); 122 assertEquals(Atomics.OK, worker.getMessage());
107 worker.terminate(); 123 worker.terminate();
124
125 var worker2 = new Worker(workerScript);
126 var offset = 8;
127 var i32a2 = new Int32Array(sab, offset);
128 worker2.postMessage({sab: sab, offset: offset}, [sab]);
129
130 // Spin until the worker is waiting on the futex.
131 while (%AtomicsFutexNumWaitersForTesting(i32a2, 0) != 1) {}
132 Atomics.futexWake(i32a2, 0, 1);
133 assertEquals(Atomics.OK, worker2.getMessage());
134 worker2.terminate();
135
136 // Futex should work when index and buffer views are different, but
137 // the real address is the same.
138 var worker3 = new Worker(workerScript);
139 i32a2 = new Int32Array(sab, 4);
140 worker3.postMessage({sab: sab, offset: 8}, [sab]);
141
142 // Spin until the worker is waiting on the futex.
143 while (%AtomicsFutexNumWaitersForTesting(i32a2, 1) != 1) {}
144 Atomics.futexWake(i32a2, 1, 1);
145 assertEquals(Atomics.OK, worker3.getMessage());
146 worker3.terminate();
108 }; 147 };
109 148
110 // Test various infinite timeouts 149 // Test various infinite timeouts
111 TestWaitWithTimeout(undefined); 150 TestWaitWithTimeout(undefined);
112 TestWaitWithTimeout(NaN); 151 TestWaitWithTimeout(NaN);
113 TestWaitWithTimeout(Infinity); 152 TestWaitWithTimeout(Infinity);
114 153
115 154
116 (function TestWakeMulti() { 155 (function TestWakeMulti() {
117 var sab = new SharedArrayBuffer(20); 156 var sab = new SharedArrayBuffer(20);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 wokenCount++; 298 wokenCount++;
260 } 299 }
261 } 300 }
262 } 301 }
263 302
264 assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a, index1)); 303 assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a, index1));
265 assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a, index2)); 304 assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a, index2));
266 305
267 for (id = 0; id < 4; ++id) { 306 for (id = 0; id < 4; ++id) {
268 assertEquals(Atomics.OK, workers[id].getMessage()); 307 assertEquals(Atomics.OK, workers[id].getMessage());
308 }
309
310 // Test futexWakeOrRequeue on offset typed array
311 var offset = 16;
312 sab = new SharedArrayBuffer(24);
313 i32a = new Int32Array(sab);
314 var i32a2 = new Int32Array(sab, offset);
315
316 for (id = 0; id < 4; id++) {
317 workers[id].postMessage({sab: sab, id: id}, [sab]);
318 }
319
320 while (%AtomicsFutexNumWaitersForTesting(i32a2, 0) != 4) { }
321
322 index1 = 0;
323 index2 = 1;
324 assertEquals(4, %AtomicsFutexNumWaitersForTesting(i32a2, index1));
325 assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a2, index2));
326
327 assertEquals(2, Atomics.futexWakeOrRequeue(i32a2, index1, 2, 0, index2));
328 assertEquals(2, %AtomicsFutexNumWaitersForTesting(i32a2, index2));
329 assertEquals(0, %AtomicsFutexNumWaitersForTesting(i32a2, index1));
330
331 assertEquals(2, Atomics.futexWake(i32a2, index2, 2));
332
333 for (id = 0; id < 4; ++id) {
334 assertEquals(Atomics.OK, workers[id].getMessage());
269 workers[id].terminate(); 335 workers[id].terminate();
270 } 336 }
271 337
272 })(); 338 })();
273 339
274 } 340 }
OLDNEW
« no previous file with comments | « src/runtime/runtime-futex.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698