| 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 |