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