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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2118903002: scheduler: Move the Blink scheduler into Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "components/scheduler/renderer/renderer_scheduler_impl.h" 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/stack_trace.h" 8 #include "base/debug/stack_trace.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
13 #include "base/trace_event/trace_event_argument.h" 13 #include "base/trace_event/trace_event_argument.h"
14 #include "cc/output/begin_frame_args.h" 14 #include "cc/output/begin_frame_args.h"
15 #include "components/scheduler/base/task_queue_impl.h" 15 #include "platform/scheduler/base/task_queue_impl.h"
16 #include "components/scheduler/base/task_queue_selector.h" 16 #include "platform/scheduler/base/task_queue_selector.h"
17 #include "components/scheduler/base/virtual_time_domain.h" 17 #include "platform/scheduler/base/virtual_time_domain.h"
18 #include "components/scheduler/child/scheduler_tqm_delegate.h" 18 #include "platform/scheduler/child/scheduler_tqm_delegate.h"
19 #include "components/scheduler/renderer/auto_advancing_virtual_time_domain.h" 19 #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h"
20 #include "components/scheduler/renderer/web_view_scheduler_impl.h" 20 #include "platform/scheduler/renderer/web_view_scheduler_impl.h"
21 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" 21 #include "platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h"
22 22
23 namespace blink {
23 namespace scheduler { 24 namespace scheduler {
24 namespace { 25 namespace {
25 // The run time of loading tasks is strongly bimodal. The vast majority are 26 // The run time of loading tasks is strongly bimodal. The vast majority are
26 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 27 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1
27 // second on a mobile device) so we take a very pessimistic view when estimating 28 // second on a mobile device) so we take a very pessimistic view when estimating
28 // the cost of loading tasks. 29 // the cost of loading tasks.
29 const int kLoadingTaskEstimationSampleCount = 1000; 30 const int kLoadingTaskEstimationSampleCount = 1000;
30 const double kLoadingTaskEstimationPercentile = 99; 31 const double kLoadingTaskEstimationPercentile = 99;
31 const int kTimerTaskEstimationSampleCount = 1000; 32 const int kTimerTaskEstimationSampleCount = 1000;
32 const double kTimerTaskEstimationPercentile = 99; 33 const double kTimerTaskEstimationPercentile = 99;
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 658
658 base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadlineForTesting() 659 base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadlineForTesting()
659 const { 660 const {
660 return idle_helper_.CurrentIdleTaskDeadline(); 661 return idle_helper_.CurrentIdleTaskDeadline();
661 } 662 }
662 663
663 void RendererSchedulerImpl::RunIdleTasksForTesting( 664 void RendererSchedulerImpl::RunIdleTasksForTesting(
664 const base::Closure& callback) { 665 const base::Closure& callback) {
665 MainThreadOnly().in_idle_period_for_testing = true; 666 MainThreadOnly().in_idle_period_for_testing = true;
666 IdleTaskRunner()->PostIdleTask( 667 IdleTaskRunner()->PostIdleTask(
667 FROM_HERE, 668 FROM_HERE, base::Bind(&RendererSchedulerImpl::EndIdlePeriodForTesting,
668 base::Bind(&RendererSchedulerImpl::EndIdlePeriodForTesting, 669 weak_factory_.GetWeakPtr(), callback));
669 weak_factory_.GetWeakPtr(), callback));
670 idle_helper_.EnableLongIdlePeriod(); 670 idle_helper_.EnableLongIdlePeriod();
671 } 671 }
672 672
673 void RendererSchedulerImpl::MaybeUpdatePolicy() { 673 void RendererSchedulerImpl::MaybeUpdatePolicy() {
674 helper_.CheckOnValidThread(); 674 helper_.CheckOnValidThread();
675 if (policy_may_need_update_.IsSet()) { 675 if (policy_may_need_update_.IsSet()) {
676 UpdatePolicy(); 676 UpdatePolicy();
677 } 677 }
678 } 678 }
679 679
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
1097 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() { 1097 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() {
1098 return &MainThreadOnly().idle_time_estimator; 1098 return &MainThreadOnly().idle_time_estimator;
1099 } 1099 }
1100 1100
1101 void RendererSchedulerImpl::SuspendTimerQueue() { 1101 void RendererSchedulerImpl::SuspendTimerQueue() {
1102 MainThreadOnly().timer_queue_suspend_count++; 1102 MainThreadOnly().timer_queue_suspend_count++;
1103 ForceUpdatePolicy(); 1103 ForceUpdatePolicy();
1104 #ifndef NDEBUG 1104 #ifndef NDEBUG
1105 DCHECK(!default_timer_task_runner_->IsQueueEnabled()); 1105 DCHECK(!default_timer_task_runner_->IsQueueEnabled());
1106 for (const auto& runner : timer_task_runners_) { 1106 for (const auto& runner : timer_task_runners_) {
1107 DCHECK(!runner->IsQueueEnabled()); 1107 DCHECK(!runner->IsQueueEnabled());
1108 } 1108 }
1109 #endif 1109 #endif
1110 } 1110 }
1111 1111
1112 void RendererSchedulerImpl::ResumeTimerQueue() { 1112 void RendererSchedulerImpl::ResumeTimerQueue() {
1113 MainThreadOnly().timer_queue_suspend_count--; 1113 MainThreadOnly().timer_queue_suspend_count--;
1114 DCHECK_GE(MainThreadOnly().timer_queue_suspend_count, 0); 1114 DCHECK_GE(MainThreadOnly().timer_queue_suspend_count, 0);
1115 ForceUpdatePolicy(); 1115 ForceUpdatePolicy();
1116 } 1116 }
1117 1117
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 1248
1249 void RendererSchedulerImpl::OnIdlePeriodEnded() { 1249 void RendererSchedulerImpl::OnIdlePeriodEnded() {
1250 base::AutoLock lock(any_thread_lock_); 1250 base::AutoLock lock(any_thread_lock_);
1251 AnyThread().last_idle_period_end_time = 1251 AnyThread().last_idle_period_end_time =
1252 helper_.scheduler_tqm_delegate()->NowTicks(); 1252 helper_.scheduler_tqm_delegate()->NowTicks();
1253 AnyThread().in_idle_period = false; 1253 AnyThread().in_idle_period = false;
1254 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); 1254 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED);
1255 } 1255 }
1256 1256
1257 void RendererSchedulerImpl::AddPendingNavigation( 1257 void RendererSchedulerImpl::AddPendingNavigation(
1258 blink::WebScheduler::NavigatingFrameType type) { 1258 WebScheduler::NavigatingFrameType type) {
1259 helper_.CheckOnValidThread(); 1259 helper_.CheckOnValidThread();
1260 if (type == blink::WebScheduler::NavigatingFrameType::kMainFrame) { 1260 if (type == blink::WebScheduler::NavigatingFrameType::kMainFrame) {
1261 MainThreadOnly().navigation_task_expected_count++; 1261 MainThreadOnly().navigation_task_expected_count++;
1262 UpdatePolicy(); 1262 UpdatePolicy();
1263 } 1263 }
1264 } 1264 }
1265 1265
1266 void RendererSchedulerImpl::RemovePendingNavigation( 1266 void RendererSchedulerImpl::RemovePendingNavigation(
1267 blink::WebScheduler::NavigatingFrameType type) { 1267 WebScheduler::NavigatingFrameType type) {
1268 helper_.CheckOnValidThread(); 1268 helper_.CheckOnValidThread();
1269 DCHECK_GT(MainThreadOnly().navigation_task_expected_count, 0); 1269 DCHECK_GT(MainThreadOnly().navigation_task_expected_count, 0);
1270 if (type == blink::WebScheduler::NavigatingFrameType::kMainFrame && 1270 if (type == blink::WebScheduler::NavigatingFrameType::kMainFrame &&
1271 MainThreadOnly().navigation_task_expected_count > 0) { 1271 MainThreadOnly().navigation_task_expected_count > 0) {
1272 MainThreadOnly().navigation_task_expected_count--; 1272 MainThreadOnly().navigation_task_expected_count--;
1273 UpdatePolicy(); 1273 UpdatePolicy();
1274 } 1274 }
1275 } 1275 }
1276 1276
1277 void RendererSchedulerImpl::OnNavigationStarted() { 1277 void RendererSchedulerImpl::OnNavigationStarted() {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1363 MainThreadOnly().web_view_schedulers.insert(web_view_scheduler); 1363 MainThreadOnly().web_view_schedulers.insert(web_view_scheduler);
1364 } 1364 }
1365 1365
1366 void RendererSchedulerImpl::RemoveWebViewScheduler( 1366 void RendererSchedulerImpl::RemoveWebViewScheduler(
1367 WebViewSchedulerImpl* web_view_scheduler) { 1367 WebViewSchedulerImpl* web_view_scheduler) {
1368 DCHECK(MainThreadOnly().web_view_schedulers.find(web_view_scheduler) != 1368 DCHECK(MainThreadOnly().web_view_schedulers.find(web_view_scheduler) !=
1369 MainThreadOnly().web_view_schedulers.end()); 1369 MainThreadOnly().web_view_schedulers.end());
1370 MainThreadOnly().web_view_schedulers.erase(web_view_scheduler); 1370 MainThreadOnly().web_view_schedulers.erase(web_view_scheduler);
1371 } 1371 }
1372 1372
1373 void RendererSchedulerImpl::BroadcastConsoleWarning( 1373 void RendererSchedulerImpl::BroadcastIntervention(const std::string& message) {
1374 const std::string& message) {
1375 helper_.CheckOnValidThread(); 1374 helper_.CheckOnValidThread();
1376 for (auto* web_view_scheduler : MainThreadOnly().web_view_schedulers) 1375 for (auto* web_view_scheduler : MainThreadOnly().web_view_schedulers)
1377 web_view_scheduler->AddConsoleWarning(message); 1376 web_view_scheduler->ReportIntervention(message);
1378 } 1377 }
1379 1378
1380 void RendererSchedulerImpl::OnTriedToExecuteBlockedTask( 1379 void RendererSchedulerImpl::OnTriedToExecuteBlockedTask(
1381 const TaskQueue& queue, 1380 const TaskQueue& queue,
1382 const base::PendingTask& task) { 1381 const base::PendingTask& task) {
1383 if (!MainThreadOnly().expensive_task_blocking_allowed || 1382 if (!MainThreadOnly().expensive_task_blocking_allowed ||
1384 MainThreadOnly().current_use_case == UseCase::TOUCHSTART || 1383 MainThreadOnly().current_use_case == UseCase::TOUCHSTART ||
1385 MainThreadOnly().longest_jank_free_task_duration < 1384 MainThreadOnly().longest_jank_free_task_duration <
1386 base::TimeDelta::FromMilliseconds(kRailsResponseTimeMillis) || 1385 base::TimeDelta::FromMilliseconds(kRailsResponseTimeMillis) ||
1387 MainThreadOnly().timer_queue_suspend_count || 1386 MainThreadOnly().timer_queue_suspend_count ||
(...skipping 13 matching lines...) Expand all
1401 } 1400 }
1402 1401
1403 if (!MainThreadOnly().have_reported_blocking_intervention_since_navigation) { 1402 if (!MainThreadOnly().have_reported_blocking_intervention_since_navigation) {
1404 { 1403 {
1405 base::AutoLock lock(any_thread_lock_); 1404 base::AutoLock lock(any_thread_lock_);
1406 if (!AnyThread().have_seen_touchstart) 1405 if (!AnyThread().have_seen_touchstart)
1407 return; 1406 return;
1408 } 1407 }
1409 MainThreadOnly().have_reported_blocking_intervention_since_navigation = 1408 MainThreadOnly().have_reported_blocking_intervention_since_navigation =
1410 true; 1409 true;
1411 BroadcastConsoleWarning( 1410 BroadcastIntervention(
1412 "Blink deferred a task in order to make scrolling smoother. " 1411 "Blink deferred a task in order to make scrolling smoother. "
1413 "Your timer and network tasks should take less than 50ms to run " 1412 "Your timer and network tasks should take less than 50ms to run "
1414 "to avoid this. Please see " 1413 "to avoid this. Please see "
1415 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail" 1414 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail"
1416 " and https://crbug.com/574343#c40 for more information."); 1415 " and https://crbug.com/574343#c40 for more information.");
1417 } 1416 }
1418 } 1417 }
1419 1418
1420 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time, 1419 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time,
1421 base::TimeTicks end_time) { 1420 base::TimeTicks end_time) {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1497 return "idle"; 1496 return "idle";
1498 case v8::PERFORMANCE_LOAD: 1497 case v8::PERFORMANCE_LOAD:
1499 return "load"; 1498 return "load";
1500 default: 1499 default:
1501 NOTREACHED(); 1500 NOTREACHED();
1502 return nullptr; 1501 return nullptr;
1503 } 1502 }
1504 } 1503 }
1505 1504
1506 } // namespace scheduler 1505 } // namespace scheduler
1506 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698