7ff1857560
This is a reland of commit ea9a1f1cbe
Changes since revert:
- Make the state field uintptr-aligned since arm64 faults on
atomic accesses to non-naturally aligned addresses.
Original change's description:
> [shared-struct] Add Atomics.Mutex
>
> This CL adds a moving GC-safe, JS-exposed mutex behind the
> --harmony-struct flag. It uses a ParkingLot-inspired algorithm and
> each mutex manages its own waiter queue.
>
> For more details, please see the design doc: https://docs.google.com/document/d/1QHkmiTF770GKxtoP-VQ1eKF42MpedLUeqiQPfCqus0Y/edit?usp=sharing
>
> Bug: v8:12547
> Change-Id: Ic58f8750d2e14ecd573173d17d5235a136bedef9
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3595460
> Commit-Queue: Shu-yu Guo <syg@chromium.org>
> Reviewed-by: Dominik Inführ <dinfuehr@chromium.org>
> Reviewed-by: Adam Klein <adamk@chromium.org>
> Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#80789}
Bug: v8:12547
Change-Id: I776cbf6ea860dcc6cb0ac51694a9b584b53d255c
Cq-Include-Trybots: luci.v8.try:v8_linux64_tsan_rel_ng
Cq-Include-Trybots: luci.v8.try:v8_mac_arm64_rel_ng
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3673354
Reviewed-by: Dominik Inführ <dinfuehr@chromium.org>
Reviewed-by: Adam Klein <adamk@chromium.org>
Commit-Queue: Shu-yu Guo <syg@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80875}
34 lines
933 B
JavaScript
34 lines
933 B
JavaScript
// Copyright 2022 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
|
|
|
|
let mutex = new Atomics.Mutex;
|
|
let locked_count = 0;
|
|
|
|
assertEquals(42, Atomics.Mutex.lock(mutex, () => {
|
|
locked_count++; return 42;
|
|
}));
|
|
assertEquals(locked_count, 1);
|
|
|
|
// tryLock returns true when successful.
|
|
assertTrue(Atomics.Mutex.tryLock(mutex, () => { locked_count++; }));
|
|
assertEquals(locked_count, 2);
|
|
|
|
// Recursively locking throws.
|
|
Atomics.Mutex.lock(mutex, () => {
|
|
locked_count++;
|
|
assertThrows(() => {
|
|
Atomics.Mutex.lock(mutex, () => { throw "unreachable"; });
|
|
}, Error);
|
|
});
|
|
assertEquals(locked_count, 3);
|
|
|
|
// Recursive tryLock'ing returns false.
|
|
Atomics.Mutex.lock(mutex, () => {
|
|
locked_count++;
|
|
assertFalse(Atomics.Mutex.tryLock(mutex, () => { throw "unreachable"; }));
|
|
});
|
|
assertEquals(locked_count, 4);
|