| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --harmony-sharedarraybuffer --harmony-atomics-waitasync |
| |
| const N = 10; |
| |
| const script = ` |
| const sab = new SharedArrayBuffer(16); |
| const i32a = new Int32Array(sab); |
| const location = 0; |
| const expected_value = 0; |
| |
| const N = ${N}; |
| |
| function start() { |
| // Create N async waiters; the even ones without timeout and the odd ones |
| // with timeout. |
| for (let i = 0; i < N; ++i) { |
| let result; |
| if (i % 2 == 0) { |
| result = Atomics.waitAsync(i32a, location, expected_value); |
| } else { |
| result = Atomics.waitAsync(i32a, location, expected_value, i); |
| } |
| result.value.then( |
| (value) => { postMessage(value + " " + i); }, |
| () => { postMessage("unexpected"); }); |
| } |
| } |
| |
| function wakeUpRemainingWaiters() { |
| // Wake up all waiters |
| let notify_return_value = Atomics.notify(i32a, location); |
| postMessage("notify return value " + notify_return_value); |
| } |
| |
| function onmessage(param) { |
| if (param == "start") { |
| start(); |
| } else if (param == "wakeUpRemainingWaiters") { |
| wakeUpRemainingWaiters(); |
| } |
| }` |
| |
| const w = new Worker(script, {type : 'string'}); |
| w.postMessage("start"); |
| |
| // Verify that all timed out waiters timed out in timeout order. |
| let waiter_no = 1; |
| for (let i = 0; i < N / 2; ++i) { |
| const m = w.getMessage(); |
| assertEquals("timed-out " + waiter_no, m); |
| waiter_no += 2; |
| } |
| w.postMessage("wakeUpRemainingWaiters"); |
| const m = w.getMessage(); |
| assertEquals("notify return value " + N / 2, m); |
| |
| // Verify that the waiters woke up in FIFO order. |
| waiter_no = 0; |
| for (let i = 0; i < N / 2; ++i) { |
| const m = w.getMessage(); |
| assertEquals("ok " + waiter_no, m); |
| waiter_no += 2; |
| } |
| w.terminate(); |