node/deps/v8/test/mjsunit/shared-memory/mutex-async-lock-promise-resolve.js
Michaël Zasso 9d7cd9b864
deps: update V8 to 12.8.374.13
PR-URL: https://github.com/nodejs/node/pull/54077
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Richard Lau <rlau@redhat.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
2024-08-16 16:03:01 +02:00

39 lines
1.3 KiB
JavaScript

// Copyright 2024 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-struct --allow-natives-syntax
(function TestAsyncPromiseResolveValueAndChain() {
let mutex = new Atomics.Mutex();
let thenExecuted = false;
let waitResolve;
let waitPromise = new Promise((resolve) => {
waitResolve = resolve;
});
// If the return value of the callback is a promise, then lockPromise will
// be resolved when the promise is resolved.
let lockPromise = Atomics.Mutex.lockAsync(mutex, async function() {
return waitPromise;
});
assertFalse(Atomics.Mutex.tryLock(mutex, function() {}).success);
waitResolve(42);
lockPromise.then((result) => {
assertTrue(Atomics.Mutex.tryLock(mutex, function() {}).success);
assertEquals(0, %AtomicsSychronizationNumAsyncWaitersInIsolateForTesting());
// lockPromise is resolved with the same value as the callback promise.
thenExecuted = true;
assertEquals(42, result.value);
assertTrue(result.success);
});
// The lock and then callbacks will be executed when the microtask queue is
// flushed, before proceeding to the next task.
setTimeout(() => {
assertTrue(thenExecuted);
}, 0);
})();