// 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. #include "src/tasks/operations-barrier.h" namespace v8 { namespace internal { OperationsBarrier::Token OperationsBarrier::TryLock() { base::MutexGuard guard(&mutex_); if (cancelled_) return {}; ++operations_count_; return Token(this); } void OperationsBarrier::CancelAndWait() { base::MutexGuard guard(&mutex_); DCHECK(!cancelled_); cancelled_ = true; while (operations_count_ > 0) { release_condition_.Wait(&mutex_); } } void OperationsBarrier::Release() { base::MutexGuard guard(&mutex_); if (--operations_count_ == 0 && cancelled_) { release_condition_.NotifyOne(); } } } // namespace internal } // namespace v8