// 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. #ifndef V8_OBJECTS_WAITER_QUEUE_NODE_H_ #define V8_OBJECTS_WAITER_QUEUE_NODE_H_ #include "src/base/platform/condition-variable.h" #include "src/base/platform/mutex.h" namespace v8 { namespace base { class TimeDelta; } // namespace base namespace internal { class Context; class Isolate; template <typename T> class Tagged; namespace detail { // To manage waiting threads inside JSSynchronizationPrimitives, there is a // process-wide doubly-linked intrusive list per waiter (i.e. mutex or condition // variable). There is a per-thread node allocated on the stack when the thread // goes to sleep for synchronous locking and waiting, and a per-call node // allocated on the C++ heap for asynchronous locking and waiting. // // When compressing pointers (including when sandboxing), the access to the // node is indirected through the shared external pointer table. // // The WaiterQueueNode is an abstract class encapsulting the general queue // logic (enqueue, dequeue, etc...). Its extensions add the logic to handle // notifications and sync/async waiting. // TODO(v8:12547): Unittest this. class V8_NODISCARD WaiterQueueNode { … }; } // namespace detail } // namespace internal } // namespace v8 #endif // V8_OBJECTS_WAITER_QUEUE_NODE_H_