OLD | NEW |
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 #include "platform/scheduler/renderer/task_queue_throttler.h" | 5 #include "platform/scheduler/renderer/task_queue_throttler.h" |
6 | 6 |
7 #include <cstdint> | 7 #include <cstdint> |
8 | 8 |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 return base::StringPrintf( | 68 return base::StringPrintf( |
69 "0x%" PRIx64, | 69 "0x%" PRIx64, |
70 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(pointer))); | 70 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(pointer))); |
71 } | 71 } |
72 | 72 |
73 } // namespace | 73 } // namespace |
74 | 74 |
75 TaskQueueThrottler::TaskQueueThrottler( | 75 TaskQueueThrottler::TaskQueueThrottler( |
76 RendererSchedulerImpl* renderer_scheduler, | 76 RendererSchedulerImpl* renderer_scheduler, |
77 const char* tracing_category) | 77 const char* tracing_category) |
78 : task_runner_(renderer_scheduler->ControlTaskQueue()), | 78 : control_task_queue_(renderer_scheduler->ControlTaskQueue()), |
79 renderer_scheduler_(renderer_scheduler), | 79 renderer_scheduler_(renderer_scheduler), |
80 tick_clock_(renderer_scheduler->tick_clock()), | 80 tick_clock_(renderer_scheduler->tick_clock()), |
81 tracing_category_(tracing_category), | 81 tracing_category_(tracing_category), |
82 time_domain_(new ThrottledTimeDomain(tracing_category)), | 82 time_domain_(new ThrottledTimeDomain(tracing_category)), |
83 allow_throttling_(true), | 83 allow_throttling_(true), |
84 weak_factory_(this) { | 84 weak_factory_(this) { |
85 pump_throttled_tasks_closure_.Reset(base::Bind( | 85 pump_throttled_tasks_closure_.Reset(base::Bind( |
86 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr())); | 86 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr())); |
87 forward_immediate_work_callback_ = | 87 forward_immediate_work_callback_ = |
88 base::Bind(&TaskQueueThrottler::OnQueueNextWakeUpChanged, | 88 base::Bind(&TaskQueueThrottler::OnQueueNextWakeUpChanged, |
(...skipping 12 matching lines...) Expand all Loading... |
101 task_queue->RemoveFence(); | 101 task_queue->RemoveFence(); |
102 } | 102 } |
103 if (map_entry.second.throttling_ref_count != 0) | 103 if (map_entry.second.throttling_ref_count != 0) |
104 task_queue->SetObserver(nullptr); | 104 task_queue->SetObserver(nullptr); |
105 } | 105 } |
106 | 106 |
107 renderer_scheduler_->UnregisterTimeDomain(time_domain_.get()); | 107 renderer_scheduler_->UnregisterTimeDomain(time_domain_.get()); |
108 } | 108 } |
109 | 109 |
110 void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) { | 110 void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) { |
111 DCHECK_NE(task_queue, task_runner_.get()); | 111 DCHECK_NE(task_queue, control_task_queue_.get()); |
112 | 112 |
113 std::pair<TaskQueueMap::iterator, bool> insert_result = | 113 std::pair<TaskQueueMap::iterator, bool> insert_result = |
114 queue_details_.insert(std::make_pair(task_queue, Metadata())); | 114 queue_details_.insert(std::make_pair(task_queue, Metadata())); |
115 insert_result.first->second.throttling_ref_count++; | 115 insert_result.first->second.throttling_ref_count++; |
116 | 116 |
117 // If ref_count is 1, the task queue is newly throttled. | 117 // If ref_count is 1, the task queue is newly throttled. |
118 if (insert_result.first->second.throttling_ref_count != 1) | 118 if (insert_result.first->second.throttling_ref_count != 1) |
119 return; | 119 return; |
120 | 120 |
121 TRACE_EVENT1(tracing_category_, "TaskQueueThrottler_TaskQueueThrottled", | 121 TRACE_EVENT1(tracing_category_, "TaskQueueThrottler_TaskQueueThrottled", |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 // Iterator may have been deleted by BudgetPool::RemoveQueue, so don't | 187 // Iterator may have been deleted by BudgetPool::RemoveQueue, so don't |
188 // use it here. | 188 // use it here. |
189 queue_details_.erase(task_queue); | 189 queue_details_.erase(task_queue); |
190 | 190 |
191 // NOTE: Observer is automatically unregistered when unregistering task queue. | 191 // NOTE: Observer is automatically unregistered when unregistering task queue. |
192 } | 192 } |
193 | 193 |
194 void TaskQueueThrottler::OnQueueNextWakeUpChanged( | 194 void TaskQueueThrottler::OnQueueNextWakeUpChanged( |
195 TaskQueue* queue, | 195 TaskQueue* queue, |
196 base::TimeTicks next_wake_up) { | 196 base::TimeTicks next_wake_up) { |
197 if (!task_runner_->RunsTasksOnCurrentThread()) { | 197 if (!control_task_queue_->RunsTasksOnCurrentThread()) { |
198 task_runner_->PostTask( | 198 control_task_queue_->PostTask( |
199 FROM_HERE, | 199 FROM_HERE, |
200 base::Bind(forward_immediate_work_callback_, queue, next_wake_up)); | 200 base::Bind(forward_immediate_work_callback_, queue, next_wake_up)); |
201 return; | 201 return; |
202 } | 202 } |
203 | 203 |
204 TRACE_EVENT0(tracing_category_, | 204 TRACE_EVENT0(tracing_category_, |
205 "TaskQueueThrottler::OnQueueNextWakeUpChanged"); | 205 "TaskQueueThrottler::OnQueueNextWakeUpChanged"); |
206 | 206 |
207 // We don't expect this to get called for disabled queues, but we can't DCHECK | 207 // We don't expect this to get called for disabled queues, but we can't DCHECK |
208 // because of the above thread hop. Just bail out if the queue is disabled. | 208 // because of the above thread hop. Just bail out if the queue is disabled. |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 } | 296 } |
297 | 297 |
298 pending_pump_throttled_tasks_runtime_ = runtime; | 298 pending_pump_throttled_tasks_runtime_ = runtime; |
299 | 299 |
300 pump_throttled_tasks_closure_.Cancel(); | 300 pump_throttled_tasks_closure_.Cancel(); |
301 | 301 |
302 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_.value() - now; | 302 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_.value() - now; |
303 TRACE_EVENT1(tracing_category_, | 303 TRACE_EVENT1(tracing_category_, |
304 "TaskQueueThrottler::MaybeSchedulePumpThrottledTasks", | 304 "TaskQueueThrottler::MaybeSchedulePumpThrottledTasks", |
305 "delay_till_next_pump_ms", delay.InMilliseconds()); | 305 "delay_till_next_pump_ms", delay.InMilliseconds()); |
306 task_runner_->PostDelayedTask( | 306 control_task_queue_->PostDelayedTask( |
307 from_here, pump_throttled_tasks_closure_.GetCallback(), delay); | 307 from_here, pump_throttled_tasks_closure_.GetCallback(), delay); |
308 } | 308 } |
309 | 309 |
310 CPUTimeBudgetPool* TaskQueueThrottler::CreateCPUTimeBudgetPool( | 310 CPUTimeBudgetPool* TaskQueueThrottler::CreateCPUTimeBudgetPool( |
311 const char* name) { | 311 const char* name) { |
312 CPUTimeBudgetPool* time_budget_pool = | 312 CPUTimeBudgetPool* time_budget_pool = |
313 new CPUTimeBudgetPool(name, this, tick_clock_->NowTicks()); | 313 new CPUTimeBudgetPool(name, this, tick_clock_->NowTicks()); |
314 budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool); | 314 budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool); |
315 return time_budget_pool; | 315 return time_budget_pool; |
316 } | 316 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 queue->InsertFence(TaskQueue::InsertFencePosition::BEGINNING_OF_TIME); | 484 queue->InsertFence(TaskQueue::InsertFencePosition::BEGINNING_OF_TIME); |
485 queue->SetTimeDomain(time_domain_.get()); | 485 queue->SetTimeDomain(time_domain_.get()); |
486 SchedulePumpQueue(FROM_HERE, lazy_now.Now(), queue); | 486 SchedulePumpQueue(FROM_HERE, lazy_now.Now(), queue); |
487 } | 487 } |
488 | 488 |
489 TRACE_EVENT0(tracing_category_, "TaskQueueThrottler_EnableThrottling"); | 489 TRACE_EVENT0(tracing_category_, "TaskQueueThrottler_EnableThrottling"); |
490 } | 490 } |
491 | 491 |
492 } // namespace scheduler | 492 } // namespace scheduler |
493 } // namespace blink | 493 } // namespace blink |
OLD | NEW |