Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h

Issue 2778123003: [scheduler] Add WakeupBudgetPool. (Closed)
Patch Set: Addressed comments from alexclarke@ Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_TASK_QUEUE_THROTTL ER_H_ 5 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_TASK_QUEUE_THROTTL ER_H_
6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_TASK_QUEUE_THROTTL ER_H_ 6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_TASK_QUEUE_THROTTL ER_H_
7 7
8 #include <set> 8 #include <set>
9 #include <unordered_map> 9 #include <unordered_map>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/optional.h" 13 #include "base/optional.h"
14 #include "base/threading/thread_checker.h" 14 #include "base/threading/thread_checker.h"
15 #include "platform/scheduler/base/cancelable_closure_holder.h" 15 #include "platform/scheduler/base/cancelable_closure_holder.h"
16 #include "platform/scheduler/base/time_domain.h" 16 #include "platform/scheduler/base/time_domain.h"
17 #include "platform/scheduler/renderer/budget_pool.h" 17 #include "platform/scheduler/renderer/budget_pool.h"
18 #include "platform/scheduler/renderer/cpu_time_budget_pool.h"
19 #include "platform/scheduler/renderer/wake_up_budget_pool.h"
18 #include "platform/scheduler/renderer/web_view_scheduler.h" 20 #include "platform/scheduler/renderer/web_view_scheduler.h"
19 21
20 namespace base { 22 namespace base {
21 namespace trace_event { 23 namespace trace_event {
22 class TracedValue; 24 class TracedValue;
23 } 25 }
24 } 26 }
25 27
26 namespace blink { 28 namespace blink {
27 namespace scheduler { 29 namespace scheduler {
28 30
29 class BudgetPool; 31 class BudgetPool;
30 class RendererSchedulerImpl; 32 class RendererSchedulerImpl;
31 class ThrottledTimeDomain; 33 class ThrottledTimeDomain;
32 class CPUTimeBudgetPool; 34 class CPUTimeBudgetPool;
35 class WakeUpBudgetPool;
36
37 // kNewTasksOnly prevents new tasks from running (old tasks can run normally),
38 // kAllTasks block queue completely.
39 // kAllTasks-type block always blocks the queue completely.
40 // kNewTasksOnly-type block does nothing when queue is already blocked by
41 // kAllTasks, and overrides previous kNewTasksOnly block if any, which may
42 // unblock some tasks.
43 enum class QueueBlockType { kAllTasks, kNewTasksOnly };
33 44
34 // Interface for BudgetPool to interact with TaskQueueThrottler. 45 // Interface for BudgetPool to interact with TaskQueueThrottler.
35 class BLINK_PLATFORM_EXPORT BudgetPoolController { 46 class BLINK_PLATFORM_EXPORT BudgetPoolController {
36 public: 47 public:
37 virtual ~BudgetPoolController() {} 48 virtual ~BudgetPoolController() {}
38 49
39 // To be used by BudgetPool only, use BudgetPool::{Add,Remove}Queue 50 // To be used by BudgetPool only, use BudgetPool::{Add,Remove}Queue
40 // methods instead. 51 // methods instead.
41 virtual void AddQueueToBudgetPool(TaskQueue* queue, 52 virtual void AddQueueToBudgetPool(TaskQueue* queue,
42 BudgetPool* budget_pool) = 0; 53 BudgetPool* budget_pool) = 0;
43 virtual void RemoveQueueFromBudgetPool(TaskQueue* queue, 54 virtual void RemoveQueueFromBudgetPool(TaskQueue* queue,
44 BudgetPool* budget_pool) = 0; 55 BudgetPool* budget_pool) = 0;
45 56
46 // Deletes the budget pool. 57 // Deletes the budget pool.
47 virtual void UnregisterBudgetPool(BudgetPool* budget_pool) = 0; 58 virtual void UnregisterBudgetPool(BudgetPool* budget_pool) = 0;
48 59
49 // Insert a fence to prevent tasks from running and schedule a wake-up at 60 // Ensure that an appropriate type of the fence is installed and schedule
50 // an appropriate time. 61 // a pump for this queue when needed.
51 virtual void BlockQueue(base::TimeTicks now, TaskQueue* queue) = 0; 62 virtual void UpdateQueueThrottlingState(base::TimeTicks now,
52 63 TaskQueue* queue) = 0;
53 // Schedule a call to unblock queue at an appropriate moment.
54 virtual void UnblockQueue(base::TimeTicks now, TaskQueue* queue) = 0;
55 64
56 // Returns true if the |queue| is throttled (i.e. added to TaskQueueThrottler 65 // Returns true if the |queue| is throttled (i.e. added to TaskQueueThrottler
57 // and throttling is not disabled). 66 // and throttling is not disabled).
58 virtual bool IsThrottled(TaskQueue* queue) const = 0; 67 virtual bool IsThrottled(TaskQueue* queue) const = 0;
59 }; 68 };
60 69
61 // The job of the TaskQueueThrottler is to control when tasks posted on 70 // The job of the TaskQueueThrottler is to control when tasks posted on
62 // throttled queues get run. The TaskQueueThrottler: 71 // throttled queues get run. The TaskQueueThrottler:
63 // - runs throttled tasks once per second, 72 // - runs throttled tasks once per second,
64 // - controls time budget for task queues grouped in CPUTimeBudgetPools. 73 // - controls time budget for task queues grouped in CPUTimeBudgetPools.
(...skipping 27 matching lines...) Expand all
92 101
93 // TaskQueue::Observer implementation: 102 // TaskQueue::Observer implementation:
94 void OnQueueNextWakeUpChanged(TaskQueue* queue, 103 void OnQueueNextWakeUpChanged(TaskQueue* queue,
95 base::TimeTicks wake_up) override; 104 base::TimeTicks wake_up) override;
96 105
97 // BudgetPoolController implementation: 106 // BudgetPoolController implementation:
98 void AddQueueToBudgetPool(TaskQueue* queue, BudgetPool* budget_pool) override; 107 void AddQueueToBudgetPool(TaskQueue* queue, BudgetPool* budget_pool) override;
99 void RemoveQueueFromBudgetPool(TaskQueue* queue, 108 void RemoveQueueFromBudgetPool(TaskQueue* queue,
100 BudgetPool* budget_pool) override; 109 BudgetPool* budget_pool) override;
101 void UnregisterBudgetPool(BudgetPool* budget_pool) override; 110 void UnregisterBudgetPool(BudgetPool* budget_pool) override;
102 void BlockQueue(base::TimeTicks now, TaskQueue* queue) override; 111 void UpdateQueueThrottlingState(base::TimeTicks now,
103 void UnblockQueue(base::TimeTicks now, TaskQueue* queue) override; 112 TaskQueue* queue) override;
104 bool IsThrottled(TaskQueue* queue) const override; 113 bool IsThrottled(TaskQueue* queue) const override;
105 114
106 // Increments the throttled refcount and causes |task_queue| to be throttled 115 // Increments the throttled refcount and causes |task_queue| to be throttled
107 // if its not already throttled. 116 // if its not already throttled.
108 void IncreaseThrottleRefCount(TaskQueue* task_queue); 117 void IncreaseThrottleRefCount(TaskQueue* task_queue);
109 118
110 // If the refcouint is non-zero it's decremented. If the throttled refcount 119 // If the refcouint is non-zero it's decremented. If the throttled refcount
111 // becomes zero then |task_queue| is unthrottled. If the refcount was already 120 // becomes zero then |task_queue| is unthrottled. If the refcount was already
112 // zero this function does nothing. 121 // zero this function does nothing.
113 void DecreaseThrottleRefCount(TaskQueue* task_queue); 122 void DecreaseThrottleRefCount(TaskQueue* task_queue);
(...skipping 11 matching lines...) Expand all
125 134
126 const ThrottledTimeDomain* time_domain() const { return time_domain_.get(); } 135 const ThrottledTimeDomain* time_domain() const { return time_domain_.get(); }
127 136
128 static base::TimeTicks AlignedThrottledRunTime( 137 static base::TimeTicks AlignedThrottledRunTime(
129 base::TimeTicks unthrottled_runtime); 138 base::TimeTicks unthrottled_runtime);
130 139
131 const scoped_refptr<TaskQueue>& task_runner() const { return task_runner_; } 140 const scoped_refptr<TaskQueue>& task_runner() const { return task_runner_; }
132 141
133 // Returned object is owned by |TaskQueueThrottler|. 142 // Returned object is owned by |TaskQueueThrottler|.
134 CPUTimeBudgetPool* CreateCPUTimeBudgetPool(const char* name); 143 CPUTimeBudgetPool* CreateCPUTimeBudgetPool(const char* name);
144 WakeUpBudgetPool* CreateWakeUpBudgetPool(const char* name);
135 145
136 // Accounts for given task for cpu-based throttling needs. 146 // Accounts for given task for cpu-based throttling needs.
137 void OnTaskRunTimeReported(TaskQueue* task_queue, 147 void OnTaskRunTimeReported(TaskQueue* task_queue,
138 base::TimeTicks start_time, 148 base::TimeTicks start_time,
139 base::TimeTicks end_time); 149 base::TimeTicks end_time);
140 150
141 void AsValueInto(base::trace_event::TracedValue* state, 151 void AsValueInto(base::trace_event::TracedValue* state,
142 base::TimeTicks now) const; 152 base::TimeTicks now) const;
143 private: 153 private:
144 struct Metadata { 154 struct Metadata {
(...skipping 10 matching lines...) Expand all
155 // Note |unthrottled_runtime| might be in the past. When this happens we 165 // Note |unthrottled_runtime| might be in the past. When this happens we
156 // compute the delay to the next runtime based on now rather than 166 // compute the delay to the next runtime based on now rather than
157 // unthrottled_runtime. 167 // unthrottled_runtime.
158 void MaybeSchedulePumpThrottledTasks( 168 void MaybeSchedulePumpThrottledTasks(
159 const tracked_objects::Location& from_here, 169 const tracked_objects::Location& from_here,
160 base::TimeTicks now, 170 base::TimeTicks now,
161 base::TimeTicks runtime); 171 base::TimeTicks runtime);
162 172
163 // Return next possible time when queue is allowed to run in accordance 173 // Return next possible time when queue is allowed to run in accordance
164 // with throttling policy. 174 // with throttling policy.
165 base::TimeTicks GetNextAllowedRunTime(base::TimeTicks now, TaskQueue* queue); 175 base::TimeTicks GetNextAllowedRunTime(TaskQueue* queue,
176 base::TimeTicks desired_run_time);
177
178 bool CanRunTasksAt(TaskQueue* queue, base::TimeTicks moment, bool is_wakeup);
179
180 bool CanRunTasksUntil(TaskQueue* queue,
181 base::TimeTicks now,
182 base::TimeTicks moment);
166 183
167 void MaybeDeleteQueueMetadata(TaskQueueMap::iterator it); 184 void MaybeDeleteQueueMetadata(TaskQueueMap::iterator it);
168 185
169 // Schedule a call PumpThrottledTasks at an appropriate moment for this queue. 186 void UpdateQueueThrottlingStateInternal(base::TimeTicks now,
170 void SchedulePumpQueue(const tracked_objects::Location& from_here, 187 TaskQueue* queue,
171 base::TimeTicks now, 188 bool is_wake_up);
172 TaskQueue* queue); 189
190 base::Optional<QueueBlockType> GetQueueBlockType(base::TimeTicks now,
191 TaskQueue* queue);
173 192
174 TaskQueueMap queue_details_; 193 TaskQueueMap queue_details_;
175 base::Callback<void(TaskQueue*, base::TimeTicks)> 194 base::Callback<void(TaskQueue*, base::TimeTicks)>
176 forward_immediate_work_callback_; 195 forward_immediate_work_callback_;
177 scoped_refptr<TaskQueue> task_runner_; 196 scoped_refptr<TaskQueue> task_runner_;
178 RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED 197 RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED
179 base::TickClock* tick_clock_; // NOT OWNED 198 base::TickClock* tick_clock_; // NOT OWNED
180 const char* tracing_category_; // NOT OWNED 199 const char* tracing_category_; // NOT OWNED
181 std::unique_ptr<ThrottledTimeDomain> time_domain_; 200 std::unique_ptr<ThrottledTimeDomain> time_domain_;
182 201
183 CancelableClosureHolder pump_throttled_tasks_closure_; 202 CancelableClosureHolder pump_throttled_tasks_closure_;
184 base::Optional<base::TimeTicks> pending_pump_throttled_tasks_runtime_; 203 base::Optional<base::TimeTicks> pending_pump_throttled_tasks_runtime_;
185 bool allow_throttling_; 204 bool allow_throttling_;
186 205
187 std::unordered_map<BudgetPool*, std::unique_ptr<BudgetPool>> budget_pools_; 206 std::unordered_map<BudgetPool*, std::unique_ptr<BudgetPool>> budget_pools_;
188 207
189 base::WeakPtrFactory<TaskQueueThrottler> weak_factory_; 208 base::WeakPtrFactory<TaskQueueThrottler> weak_factory_;
190 209
191 DISALLOW_COPY_AND_ASSIGN(TaskQueueThrottler); 210 DISALLOW_COPY_AND_ASSIGN(TaskQueueThrottler);
192 }; 211 };
193 212
194 } // namespace scheduler 213 } // namespace scheduler
195 } // namespace blink 214 } // namespace blink
196 215
197 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_TASK_QUEUE_THRO TTLER_H_ 216 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_TASK_QUEUE_THRO TTLER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698