| Index: third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
|
| index d3ef352f0bb74f49478fa55f5da49f9161e9c526..340a6cb14aded78a806651fab08b6c490c92e8a1 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
|
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
|
| @@ -141,6 +141,9 @@ void TaskQueueThrottler::TimeBudgetPool::DisableThrottling(LazyNow* lazy_now) {
|
| task_queue_throttler_->MaybeSchedulePumpQueue(FROM_HERE, lazy_now->Now(),
|
| queue, base::nullopt);
|
| }
|
| +
|
| + // TODO(altimin): We need to disable TimeBudgetQueues here or they will
|
| + // regenerate extra time budget when they are disabled.
|
| }
|
|
|
| bool TaskQueueThrottler::TimeBudgetPool::IsThrottlingEnabled() const {
|
| @@ -231,7 +234,9 @@ TaskQueueThrottler::TaskQueueThrottler(
|
| tick_clock_(renderer_scheduler->tick_clock()),
|
| tracing_category_(tracing_category),
|
| time_domain_(new ThrottledTimeDomain(this, tracing_category)),
|
| + is_throttling_disabled_(false),
|
| virtual_time_(false),
|
| + is_audio_active_(false),
|
| weak_factory_(this) {
|
| pump_throttled_tasks_closure_.Reset(base::Bind(
|
| &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
|
| @@ -282,9 +287,6 @@ void TaskQueueThrottler::SetQueueEnabled(TaskQueue* task_queue, bool enabled) {
|
| void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) {
|
| DCHECK_NE(task_queue, task_runner_.get());
|
|
|
| - if (virtual_time_)
|
| - return;
|
| -
|
| std::pair<TaskQueueMap::iterator, bool> insert_result =
|
| queue_details_.insert(std::make_pair(task_queue, Metadata()));
|
|
|
| @@ -292,15 +294,17 @@ void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) {
|
| // The insert was successful so we need to throttle the queue.
|
| insert_result.first->second.enabled = task_queue->IsQueueEnabled();
|
|
|
| - task_queue->SetTimeDomain(time_domain_.get());
|
| - task_queue->RemoveFence();
|
| - task_queue->SetQueueEnabled(false);
|
| -
|
| - if (!task_queue->IsEmpty()) {
|
| - if (task_queue->HasPendingImmediateWork()) {
|
| - OnTimeDomainHasImmediateWork(task_queue);
|
| - } else {
|
| - OnTimeDomainHasDelayedWork(task_queue);
|
| + if (!is_throttling_disabled_) {
|
| + task_queue->SetTimeDomain(time_domain_.get());
|
| + task_queue->RemoveFence();
|
| + task_queue->SetQueueEnabled(false);
|
| +
|
| + if (!task_queue->IsEmpty()) {
|
| + if (task_queue->HasPendingImmediateWork()) {
|
| + OnTimeDomainHasImmediateWork(task_queue);
|
| + } else {
|
| + OnTimeDomainHasDelayedWork(task_queue);
|
| + }
|
| }
|
| }
|
|
|
| @@ -312,9 +316,6 @@ void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) {
|
| }
|
|
|
| void TaskQueueThrottler::DecreaseThrottleRefCount(TaskQueue* task_queue) {
|
| - if (virtual_time_)
|
| - return;
|
| -
|
| TaskQueueMap::iterator iter = queue_details_.find(task_queue);
|
|
|
| if (iter != queue_details_.end() &&
|
| @@ -323,9 +324,11 @@ void TaskQueueThrottler::DecreaseThrottleRefCount(TaskQueue* task_queue) {
|
|
|
| MaybeDeleteQueueMetadata(iter);
|
|
|
| - task_queue->SetTimeDomain(renderer_scheduler_->real_time_domain());
|
| - task_queue->RemoveFence();
|
| - task_queue->SetQueueEnabled(enabled);
|
| + if (!is_throttling_disabled_) {
|
| + task_queue->SetTimeDomain(renderer_scheduler_->real_time_domain());
|
| + task_queue->RemoveFence();
|
| + task_queue->SetQueueEnabled(enabled);
|
| + }
|
|
|
| TRACE_EVENT1(tracing_category_, "TaskQueueThrottler_TaskQueueUntrottled",
|
| "task_queue", task_queue);
|
| @@ -446,7 +449,7 @@ void TaskQueueThrottler::MaybeSchedulePumpThrottledTasks(
|
| const tracked_objects::Location& from_here,
|
| base::TimeTicks now,
|
| base::TimeTicks unaligned_runtime) {
|
| - if (virtual_time_)
|
| + if (is_throttling_disabled_)
|
| return;
|
|
|
| base::TimeTicks runtime =
|
| @@ -473,26 +476,12 @@ void TaskQueueThrottler::MaybeSchedulePumpThrottledTasks(
|
|
|
| void TaskQueueThrottler::EnableVirtualTime() {
|
| virtual_time_ = true;
|
| + UpdateGlobalThrottlingSetting();
|
| +}
|
|
|
| - pump_throttled_tasks_closure_.Cancel();
|
| -
|
| - for (auto it = queue_details_.begin(); it != queue_details_.end();) {
|
| - TaskQueue* task_queue = it->first;
|
| - bool enabled = it->second.enabled;
|
| -
|
| - if (!it->second.time_budget_pool) {
|
| - it = queue_details_.erase(it);
|
| - } else {
|
| - // Fall back to default values.
|
| - it->second.throttling_ref_count = 0;
|
| - it->second.enabled = false;
|
| - it++;
|
| - }
|
| -
|
| - task_queue->SetTimeDomain(renderer_scheduler_->GetVirtualTimeDomain());
|
| - task_queue->RemoveFence();
|
| - task_queue->SetQueueEnabled(enabled);
|
| - }
|
| +void TaskQueueThrottler::SetIsAudioActive(bool is_audio_active) {
|
| + is_audio_active_ = is_audio_active;
|
| + UpdateGlobalThrottlingSetting();
|
| }
|
|
|
| TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool(
|
| @@ -571,5 +560,56 @@ void TaskQueueThrottler::MaybeDeleteQueueMetadata(TaskQueueMap::iterator it) {
|
| queue_details_.erase(it);
|
| }
|
|
|
| +void TaskQueueThrottler::DisableThrottling() {
|
| + is_throttling_disabled_ = true;
|
| +
|
| + for (const auto& map_entry : queue_details_) {
|
| + if (!map_entry.second.IsThrottled())
|
| + continue;
|
| +
|
| + TaskQueue* queue = map_entry.first;
|
| +
|
| + if (virtual_time_) {
|
| + queue->SetTimeDomain(renderer_scheduler_->GetVirtualTimeDomain());
|
| + } else {
|
| + queue->SetTimeDomain(renderer_scheduler_->real_time_domain());
|
| + }
|
| + queue->RemoveFence();
|
| + queue->SetQueueEnabled(map_entry.second.enabled);
|
| + }
|
| +}
|
| +
|
| +void TaskQueueThrottler::EnableThrottling() {
|
| + is_throttling_disabled_ = false;
|
| +
|
| + LazyNow lazy_now(tick_clock_);
|
| +
|
| + for (const auto& map_entry : queue_details_) {
|
| + if (!map_entry.second.IsThrottled())
|
| + continue;
|
| +
|
| + TaskQueue* queue = map_entry.first;
|
| +
|
| + queue->SetQueueEnabled(false);
|
| + queue->SetTimeDomain(time_domain_.get());
|
| + MaybeSchedulePumpQueue(FROM_HERE, lazy_now.Now(), queue,
|
| + GetNextAllowedRunTime(lazy_now.Now(), queue));
|
| + }
|
| +}
|
| +
|
| +void TaskQueueThrottler::UpdateGlobalThrottlingSetting() {
|
| + pump_throttled_tasks_closure_.Cancel();
|
| +
|
| + bool should_disable_throttling = virtual_time_ || is_audio_active_;
|
| + if (should_disable_throttling == is_throttling_disabled_)
|
| + return;
|
| +
|
| + if (should_disable_throttling) {
|
| + DisableThrottling();
|
| + } else {
|
| + EnableThrottling();
|
| + }
|
| +}
|
| +
|
| } // namespace scheduler
|
| } // namespace blink
|
|
|