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>
35 lines
1.1 KiB
JavaScript
35 lines
1.1 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 TestAsyncLock() {
|
|
let mutex = new Atomics.Mutex;
|
|
|
|
let lockPromise = Atomics.Mutex.lockAsync(mutex, function() {
|
|
throw new Error('Callback thrown');
|
|
})
|
|
let rejectExecuted = false;
|
|
let lockWasReleased = false;
|
|
let numAsyncWaitersInRejectHandler = 0;
|
|
lockPromise.then(
|
|
(result) => {
|
|
assertUnreachable();
|
|
},
|
|
(error) => {
|
|
lockWasReleased = Atomics.Mutex.tryLock(mutex, function() {}).success;
|
|
numAsyncWaitersInRejectHandler =
|
|
%AtomicsSychronizationNumAsyncWaitersInIsolateForTesting();
|
|
rejectExecuted = true;
|
|
assertEquals('Callback thrown', error.message);
|
|
});
|
|
// The lock and then callbacks will be executed when the microtask queue
|
|
// is flushed, before proceeding to the next task.
|
|
setTimeout(() => {
|
|
assertTrue(rejectExecuted);
|
|
assertTrue(rejectExecuted);
|
|
assertEquals(0, numAsyncWaitersInRejectHandler);
|
|
}, 0);
|
|
})();
|