OLD | NEW |
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 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDULER
_IMPL_H_ | 5 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDULER
_IMPL_H_ |
6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDULER
_IMPL_H_ | 6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDULER
_IMPL_H_ |
7 | 7 |
8 #include "base/atomicops.h" | 8 #include "base/atomicops.h" |
9 #include "base/gtest_prod_util.h" | 9 #include "base/gtest_prod_util.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
11 #include "base/synchronization/lock.h" | 11 #include "base/synchronization/lock.h" |
12 #include "base/trace_event/trace_log.h" | 12 #include "base/trace_event/trace_log.h" |
| 13 #include "device/base/synchronization/shared_memory_seqlock_buffer.h" |
13 #include "platform/scheduler/base/pollable_thread_safe_flag.h" | 14 #include "platform/scheduler/base/pollable_thread_safe_flag.h" |
14 #include "platform/scheduler/base/queueing_time_estimator.h" | 15 #include "platform/scheduler/base/queueing_time_estimator.h" |
15 #include "platform/scheduler/base/thread_load_tracker.h" | 16 #include "platform/scheduler/base/thread_load_tracker.h" |
16 #include "platform/scheduler/child/idle_helper.h" | 17 #include "platform/scheduler/child/idle_helper.h" |
17 #include "platform/scheduler/child/scheduler_helper.h" | 18 #include "platform/scheduler/child/scheduler_helper.h" |
18 #include "platform/scheduler/renderer/deadline_task_runner.h" | 19 #include "platform/scheduler/renderer/deadline_task_runner.h" |
19 #include "platform/scheduler/renderer/idle_time_estimator.h" | 20 #include "platform/scheduler/renderer/idle_time_estimator.h" |
20 #include "platform/scheduler/renderer/render_widget_signals.h" | 21 #include "platform/scheduler/renderer/render_widget_signals.h" |
21 #include "platform/scheduler/renderer/task_cost_estimator.h" | 22 #include "platform/scheduler/renderer/task_cost_estimator.h" |
22 #include "platform/scheduler/renderer/user_model.h" | 23 #include "platform/scheduler/renderer/user_model.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override; | 119 void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override; |
119 void RemoveTaskObserver( | 120 void RemoveTaskObserver( |
120 base::MessageLoop::TaskObserver* task_observer) override; | 121 base::MessageLoop::TaskObserver* task_observer) override; |
121 void Shutdown() override; | 122 void Shutdown() override; |
122 void SuspendTimerQueue() override; | 123 void SuspendTimerQueue() override; |
123 void ResumeTimerQueue() override; | 124 void ResumeTimerQueue() override; |
124 void SetTimerQueueSuspensionWhenBackgroundedEnabled(bool enabled) override; | 125 void SetTimerQueueSuspensionWhenBackgroundedEnabled(bool enabled) override; |
125 void SetTopLevelBlameContext( | 126 void SetTopLevelBlameContext( |
126 base::trace_event::BlameContext* blame_context) override; | 127 base::trace_event::BlameContext* blame_context) override; |
127 void SetRAILModeObserver(RAILModeObserver* observer) override; | 128 void SetRAILModeObserver(RAILModeObserver* observer) override; |
| 129 bool MainThreadSeemsUnresponsive() override; |
128 | 130 |
129 // RenderWidgetSignals::Observer implementation: | 131 // RenderWidgetSignals::Observer implementation: |
130 void SetAllRenderWidgetsHidden(bool hidden) override; | 132 void SetAllRenderWidgetsHidden(bool hidden) override; |
131 void SetHasVisibleRenderWidgetWithTouchHandler( | 133 void SetHasVisibleRenderWidgetWithTouchHandler( |
132 bool has_visible_render_widget_with_touch_handler) override; | 134 bool has_visible_render_widget_with_touch_handler) override; |
133 | 135 |
134 // SchedulerHelper::Observer implementation: | 136 // SchedulerHelper::Observer implementation: |
135 void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override; | 137 void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override; |
136 void OnTriedToExecuteBlockedTask(const TaskQueue& queue, | 138 void OnTriedToExecuteBlockedTask(const TaskQueue& queue, |
137 const base::PendingTask& task) override; | 139 const base::PendingTask& task) override; |
138 | 140 |
139 // TaskTimeObserver implementation: | 141 // TaskTimeObserver implementation: |
140 void willProcessTask(TaskQueue* task_queue, double start_time) override{}; | 142 void willProcessTask(TaskQueue* task_queue, double start_time) override; |
141 void didProcessTask(TaskQueue* task_queue, | 143 void didProcessTask(TaskQueue* task_queue, |
142 double start_time, | 144 double start_time, |
143 double end_time) override; | 145 double end_time) override; |
144 | 146 |
145 // QueueingTimeEstimator::Client implementation: | 147 // QueueingTimeEstimator::Client implementation: |
146 void OnQueueingTimeForWindowEstimated(base::TimeDelta queueing_time) override; | 148 void OnQueueingTimeForWindowEstimated(base::TimeDelta queueing_time) override; |
147 | 149 |
148 // Returns a task runner where tasks run at the highest possible priority. | 150 // Returns a task runner where tasks run at the highest possible priority. |
149 scoped_refptr<TaskQueue> ControlTaskRunner(); | 151 scoped_refptr<TaskQueue> ControlTaskRunner(); |
150 | 152 |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 scoped_refptr<TaskQueue> default_timer_task_runner_; | 395 scoped_refptr<TaskQueue> default_timer_task_runner_; |
394 | 396 |
395 // Note |virtual_time_domain_| is lazily created. | 397 // Note |virtual_time_domain_| is lazily created. |
396 std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_; | 398 std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_; |
397 | 399 |
398 base::Closure update_policy_closure_; | 400 base::Closure update_policy_closure_; |
399 DeadlineTaskRunner delayed_update_policy_runner_; | 401 DeadlineTaskRunner delayed_update_policy_runner_; |
400 CancelableClosureHolder end_renderer_hidden_idle_period_closure_; | 402 CancelableClosureHolder end_renderer_hidden_idle_period_closure_; |
401 CancelableClosureHolder suspend_timers_when_backgrounded_closure_; | 403 CancelableClosureHolder suspend_timers_when_backgrounded_closure_; |
402 | 404 |
| 405 using SeqLockQueueingTimeEstimator = |
| 406 device::SharedMemorySeqLockBuffer<QueueingTimeEstimator>; |
| 407 |
| 408 SeqLockQueueingTimeEstimator seqlock_queueing_time_estimator_; |
| 409 |
403 // We have decided to improve thread safety at the cost of some boilerplate | 410 // We have decided to improve thread safety at the cost of some boilerplate |
404 // (the accessors) for the following data members. | 411 // (the accessors) for the following data members. |
405 | 412 |
406 struct MainThreadOnly { | 413 struct MainThreadOnly { |
407 MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl, | 414 MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl, |
408 const scoped_refptr<TaskQueue>& compositor_task_runner, | 415 const scoped_refptr<TaskQueue>& compositor_task_runner, |
409 base::TickClock* time_source, | 416 base::TickClock* time_source, |
410 base::TimeTicks now); | 417 base::TimeTicks now); |
411 ~MainThreadOnly(); | 418 ~MainThreadOnly(); |
412 | 419 |
413 TaskCostEstimator loading_task_cost_estimator; | 420 TaskCostEstimator loading_task_cost_estimator; |
414 TaskCostEstimator timer_task_cost_estimator; | 421 TaskCostEstimator timer_task_cost_estimator; |
415 QueueingTimeEstimator queueing_time_estimator; | |
416 IdleTimeEstimator idle_time_estimator; | 422 IdleTimeEstimator idle_time_estimator; |
417 ThreadLoadTracker background_main_thread_load_tracker; | 423 ThreadLoadTracker background_main_thread_load_tracker; |
418 ThreadLoadTracker foreground_main_thread_load_tracker; | 424 ThreadLoadTracker foreground_main_thread_load_tracker; |
419 UseCase current_use_case; | 425 UseCase current_use_case; |
420 Policy current_policy; | 426 Policy current_policy; |
421 base::TimeTicks current_policy_expiration_time; | 427 base::TimeTicks current_policy_expiration_time; |
422 base::TimeTicks estimated_next_frame_begin; | 428 base::TimeTicks estimated_next_frame_begin; |
| 429 base::TimeTicks current_task_start_time; |
423 base::TimeDelta compositor_frame_interval; | 430 base::TimeDelta compositor_frame_interval; |
424 base::TimeDelta longest_jank_free_task_duration; | 431 base::TimeDelta longest_jank_free_task_duration; |
425 base::Optional<base::TimeTicks> last_audio_state_change; | 432 base::Optional<base::TimeTicks> last_audio_state_change; |
426 int timer_queue_suspend_count; // TIMER_TASK_QUEUE suspended if non-zero. | 433 int timer_queue_suspend_count; // TIMER_TASK_QUEUE suspended if non-zero. |
427 int navigation_task_expected_count; | 434 int navigation_task_expected_count; |
428 ExpensiveTaskPolicy expensive_task_policy; | 435 ExpensiveTaskPolicy expensive_task_policy; |
429 bool renderer_hidden; | 436 bool renderer_hidden; |
430 bool renderer_backgrounded; | 437 bool renderer_backgrounded; |
431 bool renderer_suspended; | 438 bool renderer_suspended; |
432 bool timer_queue_suspension_when_backgrounded_enabled; | 439 bool timer_queue_suspension_when_backgrounded_enabled; |
(...skipping 29 matching lines...) Expand all Loading... |
462 bool have_seen_touchstart; | 469 bool have_seen_touchstart; |
463 bool waiting_for_meaningful_paint; | 470 bool waiting_for_meaningful_paint; |
464 bool have_seen_input_since_navigation; | 471 bool have_seen_input_since_navigation; |
465 }; | 472 }; |
466 | 473 |
467 struct CompositorThreadOnly { | 474 struct CompositorThreadOnly { |
468 CompositorThreadOnly(); | 475 CompositorThreadOnly(); |
469 ~CompositorThreadOnly(); | 476 ~CompositorThreadOnly(); |
470 | 477 |
471 WebInputEvent::Type last_input_type; | 478 WebInputEvent::Type last_input_type; |
| 479 bool main_thread_seems_unresponsive; |
472 std::unique_ptr<base::ThreadChecker> compositor_thread_checker; | 480 std::unique_ptr<base::ThreadChecker> compositor_thread_checker; |
473 | 481 |
474 void CheckOnValidThread() { | 482 void CheckOnValidThread() { |
475 #if DCHECK_IS_ON() | 483 #if DCHECK_IS_ON() |
476 // We don't actually care which thread this called from, just so long as | 484 // We don't actually care which thread this called from, just so long as |
477 // its consistent. | 485 // its consistent. |
478 if (!compositor_thread_checker) | 486 if (!compositor_thread_checker) |
479 compositor_thread_checker.reset(new base::ThreadChecker()); | 487 compositor_thread_checker.reset(new base::ThreadChecker()); |
480 DCHECK(compositor_thread_checker->CalledOnValidThread()); | 488 DCHECK(compositor_thread_checker->CalledOnValidThread()); |
481 #endif | 489 #endif |
(...skipping 24 matching lines...) Expand all Loading... |
506 } | 514 } |
507 | 515 |
508 // Don't access compositor_thread_only_, instead use CompositorThreadOnly(). | 516 // Don't access compositor_thread_only_, instead use CompositorThreadOnly(). |
509 CompositorThreadOnly compositor_thread_only_; | 517 CompositorThreadOnly compositor_thread_only_; |
510 CompositorThreadOnly& CompositorThreadOnly() { | 518 CompositorThreadOnly& CompositorThreadOnly() { |
511 compositor_thread_only_.CheckOnValidThread(); | 519 compositor_thread_only_.CheckOnValidThread(); |
512 return compositor_thread_only_; | 520 return compositor_thread_only_; |
513 } | 521 } |
514 | 522 |
515 PollableThreadSafeFlag policy_may_need_update_; | 523 PollableThreadSafeFlag policy_may_need_update_; |
| 524 // The maximum expected queueing time before the main thread is considered |
| 525 // unresponsive. |
| 526 base::TimeDelta main_thread_responsiveness_threshold_; |
| 527 |
516 base::WeakPtrFactory<RendererSchedulerImpl> weak_factory_; | 528 base::WeakPtrFactory<RendererSchedulerImpl> weak_factory_; |
517 | 529 |
518 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImpl); | 530 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImpl); |
519 }; | 531 }; |
520 | 532 |
521 } // namespace scheduler | 533 } // namespace scheduler |
522 } // namespace blink | 534 } // namespace blink |
523 | 535 |
524 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDU
LER_IMPL_H_ | 536 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDU
LER_IMPL_H_ |
OLD | NEW |