xref: /aosp_15_r20/external/cronet/base/task/sequence_manager/fence.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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