Index: content/renderer/scheduler/resource_dispatch_throttler.cc |
diff --git a/content/renderer/scheduler/resource_dispatch_throttler.cc b/content/renderer/scheduler/resource_dispatch_throttler.cc |
deleted file mode 100644 |
index 927db73d9ed73f6cb5e63abc415fe15b69ac0736..0000000000000000000000000000000000000000 |
--- a/content/renderer/scheduler/resource_dispatch_throttler.cc |
+++ /dev/null |
@@ -1,146 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/renderer/scheduler/resource_dispatch_throttler.h" |
- |
-#include "base/auto_reset.h" |
-#include "base/trace_event/trace_event.h" |
-#include "content/common/resource_messages.h" |
-#include "content/renderer/scheduler/renderer_scheduler.h" |
-#include "ipc/ipc_message_macros.h" |
- |
-namespace content { |
-namespace { |
- |
-bool IsResourceRequest(const IPC::Message& msg) { |
- return msg.type() == ResourceHostMsg_RequestResource::ID; |
-} |
- |
-} // namespace |
- |
-ResourceDispatchThrottler::ResourceDispatchThrottler( |
- IPC::Sender* proxied_sender, |
- RendererScheduler* scheduler, |
- base::TimeDelta flush_period, |
- uint32 max_requests_per_flush) |
- : proxied_sender_(proxied_sender), |
- scheduler_(scheduler), |
- flush_period_(flush_period), |
- max_requests_per_flush_(max_requests_per_flush), |
- flush_timer_( |
- FROM_HERE, |
- flush_period_, |
- base::Bind(&ResourceDispatchThrottler::Flush, base::Unretained(this)), |
- false /* is_repeating */), |
- sent_requests_since_last_flush_(0) { |
- DCHECK(proxied_sender); |
- DCHECK(scheduler); |
- DCHECK_NE(flush_period_, base::TimeDelta()); |
- DCHECK(max_requests_per_flush_); |
- flush_timer_.SetTaskRunner(scheduler->LoadingTaskRunner()); |
-} |
- |
-ResourceDispatchThrottler::~ResourceDispatchThrottler() { |
- FlushAll(); |
-} |
- |
-bool ResourceDispatchThrottler::Send(IPC::Message* msg) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (msg->is_sync()) { |
- // Flush any pending requests, preserving dispatch order between async and |
- // sync requests. |
- FlushAll(); |
- return ForwardMessage(msg); |
- } |
- |
- // Always defer message forwarding if there are pending messages, ensuring |
- // message dispatch ordering consistency. |
- if (!throttled_messages_.empty()) { |
- TRACE_EVENT_INSTANT0("loader", "ResourceDispatchThrottler::ThrottleMessage", |
- TRACE_EVENT_SCOPE_THREAD); |
- throttled_messages_.push_back(msg); |
- return true; |
- } |
- |
- if (!IsResourceRequest(*msg)) |
- return ForwardMessage(msg); |
- |
- if (!scheduler_->IsHighPriorityWorkAnticipated()) |
- return ForwardMessage(msg); |
- |
- if (Now() > (last_sent_request_time_ + flush_period_)) { |
- // If sufficient time has passed since the previous send, we can effectively |
- // mark the pipeline as flushed. |
- sent_requests_since_last_flush_ = 0; |
- return ForwardMessage(msg); |
- } |
- |
- if (sent_requests_since_last_flush_ < max_requests_per_flush_) |
- return ForwardMessage(msg); |
- |
- TRACE_EVENT_INSTANT0("loader", "ResourceDispatchThrottler::ThrottleRequest", |
- TRACE_EVENT_SCOPE_THREAD); |
- throttled_messages_.push_back(msg); |
- ScheduleFlush(); |
- return true; |
-} |
- |
-base::TimeTicks ResourceDispatchThrottler::Now() const { |
- return base::TimeTicks::Now(); |
-} |
- |
-void ResourceDispatchThrottler::ScheduleFlush() { |
- DCHECK(!flush_timer_.IsRunning()); |
- flush_timer_.Reset(); |
-} |
- |
-void ResourceDispatchThrottler::Flush() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- TRACE_EVENT1("loader", "ResourceDispatchThrottler::Flush", |
- "total_throttled_messages", throttled_messages_.size()); |
- sent_requests_since_last_flush_ = 0; |
- |
- // If high-priority work is no longer anticipated, dispatch can be safely |
- // accelerated. Avoid completely flushing in such case in the event that |
- // a large number of requests have been throttled. |
- uint32 max_requests = scheduler_->IsHighPriorityWorkAnticipated() |
- ? max_requests_per_flush_ |
- : max_requests_per_flush_ * 2; |
- |
- while (!throttled_messages_.empty() && |
- (sent_requests_since_last_flush_ < max_requests || |
- !IsResourceRequest(*throttled_messages_.front()))) { |
- IPC::Message* msg = throttled_messages_.front(); |
- throttled_messages_.pop_front(); |
- ForwardMessage(msg); |
- } |
- |
- if (!throttled_messages_.empty()) |
- ScheduleFlush(); |
-} |
- |
-void ResourceDispatchThrottler::FlushAll() { |
- if (throttled_messages_.empty()) |
- return; |
- |
- TRACE_EVENT1("loader", "ResourceDispatchThrottler::FlushAll", |
- "total_throttled_messages", throttled_messages_.size()); |
- std::deque<IPC::Message*> throttled_messages; |
- throttled_messages.swap(throttled_messages_); |
- for (auto& message : throttled_messages) |
- ForwardMessage(message); |
- // There shouldn't be re-entrancy issues when forwarding an IPC, but validate |
- // as a safeguard. |
- DCHECK(throttled_messages_.empty()); |
-} |
- |
-bool ResourceDispatchThrottler::ForwardMessage(IPC::Message* msg) { |
- if (IsResourceRequest(*msg)) { |
- last_sent_request_time_ = Now(); |
- ++sent_requests_since_last_flush_; |
- } |
- return proxied_sender_->Send(msg); |
-} |
- |
-} // namespace content |