Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2638)

Unified Diff: content/renderer/scheduler/resource_dispatch_throttler.cc

Issue 897223002: Revert of Throttle resource message requests during user interaction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698