1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TASK_SEQUENCE_MANAGER_FENCE_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TASK_SEQUENCE_MANAGER_FENCE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/enqueue_order.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/task_order.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker namespace base { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker class TimeTicks; 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace sequence_manager { 17*6777b538SAndroid Build Coastguard Worker namespace internal { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker class TaskQueueImpl; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // `Fence`s are used to prevent the execution of tasks starting with a 22*6777b538SAndroid Build Coastguard Worker // particular `TaskOrder`, such that for a `Task` and a `Fence`, if 23*6777b538SAndroid Build Coastguard Worker // task.task_order() >= fence.task_order(), then the task is blocked from 24*6777b538SAndroid Build Coastguard Worker // running. Blocking fences are a special kind of fence that have a `TaskOrder` 25*6777b538SAndroid Build Coastguard Worker // less than that of any `Task`. 26*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT Fence { 27*6777b538SAndroid Build Coastguard Worker public: 28*6777b538SAndroid Build Coastguard Worker // Creates a `Fence` with the same `TaskOrder` as `task_order`, which is 29*6777b538SAndroid Build Coastguard Worker // useful for creating a fence relative to a particular `Task`. 30*6777b538SAndroid Build Coastguard Worker // `task_order.enqueue_order()` must be "set", i.e. it cannot be 31*6777b538SAndroid Build Coastguard Worker // `EnqueueOrder::none()`. 32*6777b538SAndroid Build Coastguard Worker explicit Fence(const TaskOrder& task_order); 33*6777b538SAndroid Build Coastguard Worker Fence(const Fence& other); 34*6777b538SAndroid Build Coastguard Worker Fence& operator=(const Fence& other); 35*6777b538SAndroid Build Coastguard Worker ~Fence(); 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker // Creates a blocking fence which has a `TaskOrder` that is less than that of 38*6777b538SAndroid Build Coastguard Worker // all tasks. 39*6777b538SAndroid Build Coastguard Worker static Fence BlockingFence(); 40*6777b538SAndroid Build Coastguard Worker task_order()41*6777b538SAndroid Build Coastguard Worker const TaskOrder& task_order() const { return task_order_; } 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Returns true iff this is a blocking fence. IsBlockingFence()44*6777b538SAndroid Build Coastguard Worker bool IsBlockingFence() const { 45*6777b538SAndroid Build Coastguard Worker return task_order_.enqueue_order() == EnqueueOrder::blocking_fence(); 46*6777b538SAndroid Build Coastguard Worker } 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker private: 49*6777b538SAndroid Build Coastguard Worker friend class TaskQueueImpl; // For `CreateWithEnqueueOrder()`. 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker Fence(EnqueueOrder enqueue_order, 52*6777b538SAndroid Build Coastguard Worker TimeTicks delayed_run_time, 53*6777b538SAndroid Build Coastguard Worker int sequence_num); 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Creates a `Fence` with `enqueue_order` and a null delayed run time. 56*6777b538SAndroid Build Coastguard Worker // `enqueue_order` cannot be EnqueueOrder::none(). 57*6777b538SAndroid Build Coastguard Worker static Fence CreateWithEnqueueOrder(EnqueueOrder enqueue_order); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker TaskOrder task_order_; 60*6777b538SAndroid Build Coastguard Worker }; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker } // namespace internal 63*6777b538SAndroid Build Coastguard Worker } // namespace sequence_manager 64*6777b538SAndroid Build Coastguard Worker } // namespace base 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker #endif // BASE_TASK_SEQUENCE_MANAGER_FENCE_H_ 67