// 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. #ifndef V8_TASKS_OPERATIONS_BARRIER_H_ #define V8_TASKS_OPERATIONS_BARRIER_H_ #include <cstdint> #include "src/base/macros.h" #include "src/base/platform/condition-variable.h" #include "src/base/platform/mutex.h" namespace v8 { namespace internal { // A thread-safe barrier to manage lifetime of muti-threaded operations. // // The barrier is used to determine if operations are allowed, and to keep track // of how many are currently active. Users will call TryLock() before starting // such operations. If the call succeeds the user can run the operation and the // barrier will keep track of it until the user signals that the operation is // completed. No operations are allowed after CancelAndWait() is called. // // There is no explicit way of telling the barrier when an operation is // completed, instead for convenience TryLock() will return a RAII // like object that will do so on destruction. // // For example: // // OperationsBarrier barrier_; // // void TearDown() { // barrier_.CancelAndWait(); // } // // void MaybeRunOperation() { // if (token = barrier_.TryLock()) Process(); // } // class V8_EXPORT_PRIVATE OperationsBarrier { … }; } // namespace internal } // namespace v8 #endif // V8_TASKS_OPERATIONS_BARRIER_H_