This is a reland of commitb1020a4345
Changes since revert: - Fixed global safepoint interrupts in https://chromium-review.googlesource.com/c/v8/v8/+/3820913 Original change's description: > Reland "[shared-struct] Add Atomics.Condition" > > This is a reland of commite2066ff6bf
> > Changes since revert: > - Rebased againstc991852491
, which > uses the external pointer table for the WaiterQueueNode stored > in the state field when compressing pointers. This relaxes > the alignment requirement of the state field to be 4-bytes when > compressing pointers. > - Moved the state field into the JSSynchronizationPrimitive base > class, since alignment and padding can now be made simpler. > > Original change's description: > > [shared-struct] Add Atomics.Condition > > > > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3630350 > > Reviewed-by: Dominik Inführ <dinfuehr@chromium.org> > > Reviewed-by: Adam Klein <adamk@chromium.org> > > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3763787 > Reviewed-by: Adam Klein <adamk@chromium.org> > Reviewed-by: Dominik Inführ <dinfuehr@chromium.org> Bug: v8:12547 Change-Id: Ibc6de74c7853e4ea766ff2c70f92339ba69f2675 Cq-Include-Trybots: luci.v8.try:v8_linux_arm64_rel_ng,v8_linux64_tsan_rel_ng Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3820901 Reviewed-by: Adam Klein <adamk@chromium.org> Commit-Queue: Shu-yu Guo <syg@chromium.org> Cr-Commit-Position: refs/heads/main@{#82368}
44 lines
1.1 KiB
JavaScript
44 lines
1.1 KiB
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 --allow-natives-syntax
|
|
|
|
"use strict";
|
|
|
|
if (this.Worker) {
|
|
|
|
(function TestWait() {
|
|
let workerScript =
|
|
`onmessage = function(msg) {
|
|
let mutex = msg.mutex;
|
|
let cv = msg.cv;
|
|
let res = Atomics.Mutex.lock(mutex, function() {
|
|
return Atomics.Condition.wait(cv, mutex);
|
|
});
|
|
postMessage(res);
|
|
};`;
|
|
|
|
let mutex = new Atomics.Mutex;
|
|
let cv = new Atomics.Condition;
|
|
let msg = {mutex, cv};
|
|
|
|
let worker1 = new Worker(workerScript, { type: 'string' });
|
|
let worker2 = new Worker(workerScript, { type: 'string' });
|
|
worker1.postMessage(msg);
|
|
worker2.postMessage(msg);
|
|
|
|
// Spin until both workers are waiting.
|
|
while (%AtomicsConditionNumWaitersForTesting(cv) != 2) {}
|
|
|
|
assertEquals(2, Atomics.Condition.notify(cv, 2));
|
|
|
|
assertEquals(true, worker1.getMessage());
|
|
assertEquals(true, worker2.getMessage());
|
|
|
|
worker1.terminate();
|
|
worker2.terminate();
|
|
})();
|
|
|
|
}
|