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/macros.h" | 9 #include "base/macros.h" |
10 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
11 #include "device/base/synchronization/shared_memory_seqlock_buffer.h" | |
11 #include "platform/scheduler/base/pollable_thread_safe_flag.h" | 12 #include "platform/scheduler/base/pollable_thread_safe_flag.h" |
12 #include "platform/scheduler/base/queueing_time_estimator.h" | 13 #include "platform/scheduler/base/queueing_time_estimator.h" |
13 #include "platform/scheduler/base/thread_load_tracker.h" | 14 #include "platform/scheduler/base/thread_load_tracker.h" |
14 #include "platform/scheduler/child/idle_helper.h" | 15 #include "platform/scheduler/child/idle_helper.h" |
15 #include "platform/scheduler/child/scheduler_helper.h" | 16 #include "platform/scheduler/child/scheduler_helper.h" |
16 #include "platform/scheduler/renderer/deadline_task_runner.h" | 17 #include "platform/scheduler/renderer/deadline_task_runner.h" |
17 #include "platform/scheduler/renderer/idle_time_estimator.h" | 18 #include "platform/scheduler/renderer/idle_time_estimator.h" |
18 #include "platform/scheduler/renderer/render_widget_signals.h" | 19 #include "platform/scheduler/renderer/render_widget_signals.h" |
19 #include "platform/scheduler/renderer/task_cost_estimator.h" | 20 #include "platform/scheduler/renderer/task_cost_estimator.h" |
20 #include "platform/scheduler/renderer/user_model.h" | 21 #include "platform/scheduler/renderer/user_model.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
115 void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override; | 116 void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override; |
116 void RemoveTaskObserver( | 117 void RemoveTaskObserver( |
117 base::MessageLoop::TaskObserver* task_observer) override; | 118 base::MessageLoop::TaskObserver* task_observer) override; |
118 void Shutdown() override; | 119 void Shutdown() override; |
119 void SuspendTimerQueue() override; | 120 void SuspendTimerQueue() override; |
120 void ResumeTimerQueue() override; | 121 void ResumeTimerQueue() override; |
121 void SetTimerQueueSuspensionWhenBackgroundedEnabled(bool enabled) override; | 122 void SetTimerQueueSuspensionWhenBackgroundedEnabled(bool enabled) override; |
122 void SetTopLevelBlameContext( | 123 void SetTopLevelBlameContext( |
123 base::trace_event::BlameContext* blame_context) override; | 124 base::trace_event::BlameContext* blame_context) override; |
124 void SetRAILModeObserver(RAILModeObserver* observer) override; | 125 void SetRAILModeObserver(RAILModeObserver* observer) override; |
126 bool MainThreadSeemsUnresponsive() override; | |
125 | 127 |
126 // RenderWidgetSignals::Observer implementation: | 128 // RenderWidgetSignals::Observer implementation: |
127 void SetAllRenderWidgetsHidden(bool hidden) override; | 129 void SetAllRenderWidgetsHidden(bool hidden) override; |
128 void SetHasVisibleRenderWidgetWithTouchHandler( | 130 void SetHasVisibleRenderWidgetWithTouchHandler( |
129 bool has_visible_render_widget_with_touch_handler) override; | 131 bool has_visible_render_widget_with_touch_handler) override; |
130 | 132 |
131 // SchedulerHelper::Observer implementation: | 133 // SchedulerHelper::Observer implementation: |
132 void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override; | 134 void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override; |
133 void OnTriedToExecuteBlockedTask(const TaskQueue& queue, | 135 void OnTriedToExecuteBlockedTask(const TaskQueue& queue, |
134 const base::PendingTask& task) override; | 136 const base::PendingTask& task) override; |
135 | 137 |
136 // TaskTimeObserver implementation: | 138 // TaskTimeObserver implementation: |
137 void ReportTaskTime(TaskQueue* task_queue, | 139 void ReportTaskStartTime(double start_time) override; |
138 double start_time, | 140 void ReportTaskEndTime(TaskQueue* task_queue, |
139 double end_time) override; | 141 double start_time, |
142 double end_time) override; | |
140 | 143 |
141 // QueueingTimeEstimator::Client implementation: | 144 // QueueingTimeEstimator::Client implementation: |
142 void OnQueueingTimeForWindowEstimated(base::TimeDelta queueing_time) override; | 145 void OnQueueingTimeForWindowEstimated(base::TimeDelta queueing_time) override; |
143 | 146 |
144 // Returns a task runner where tasks run at the highest possible priority. | 147 // Returns a task runner where tasks run at the highest possible priority. |
145 scoped_refptr<TaskQueue> ControlTaskRunner(); | 148 scoped_refptr<TaskQueue> ControlTaskRunner(); |
146 | 149 |
147 void RegisterTimeDomain(TimeDomain* time_domain); | 150 void RegisterTimeDomain(TimeDomain* time_domain); |
148 void UnregisterTimeDomain(TimeDomain* time_domain); | 151 void UnregisterTimeDomain(TimeDomain* time_domain); |
149 | 152 |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
371 scoped_refptr<TaskQueue> default_timer_task_runner_; | 374 scoped_refptr<TaskQueue> default_timer_task_runner_; |
372 | 375 |
373 // Note |virtual_time_domain_| is lazily created. | 376 // Note |virtual_time_domain_| is lazily created. |
374 std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_; | 377 std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_; |
375 | 378 |
376 base::Closure update_policy_closure_; | 379 base::Closure update_policy_closure_; |
377 DeadlineTaskRunner delayed_update_policy_runner_; | 380 DeadlineTaskRunner delayed_update_policy_runner_; |
378 CancelableClosureHolder end_renderer_hidden_idle_period_closure_; | 381 CancelableClosureHolder end_renderer_hidden_idle_period_closure_; |
379 CancelableClosureHolder suspend_timers_when_backgrounded_closure_; | 382 CancelableClosureHolder suspend_timers_when_backgrounded_closure_; |
380 | 383 |
384 using SeqLockQueueingTimeEstimator = | |
385 device::SharedMemorySeqLockBuffer<QueueingTimeEstimator>; | |
386 | |
387 SeqLockQueueingTimeEstimator seqlock_queueing_time_estimator_; | |
Sami
2016/11/14 21:16:45
Please add a short note here saying that this only
tdresser
2016/12/15 13:17:00
Why do you say it only protects access to the data
Sami
2016/12/15 17:54:37
I'm a little fuzzy on what I was going for here, b
tdresser
2016/12/15 19:16:09
Done.
| |
388 | |
381 // We have decided to improve thread safety at the cost of some boilerplate | 389 // We have decided to improve thread safety at the cost of some boilerplate |
382 // (the accessors) for the following data members. | 390 // (the accessors) for the following data members. |
383 | 391 |
384 struct MainThreadOnly { | 392 struct MainThreadOnly { |
385 MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl, | 393 MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl, |
386 const scoped_refptr<TaskQueue>& compositor_task_runner, | 394 const scoped_refptr<TaskQueue>& compositor_task_runner, |
387 base::TickClock* time_source, | 395 base::TickClock* time_source, |
388 base::TimeTicks now); | 396 base::TimeTicks now); |
389 ~MainThreadOnly(); | 397 ~MainThreadOnly(); |
390 | 398 |
391 TaskCostEstimator loading_task_cost_estimator; | 399 TaskCostEstimator loading_task_cost_estimator; |
392 TaskCostEstimator timer_task_cost_estimator; | 400 TaskCostEstimator timer_task_cost_estimator; |
393 QueueingTimeEstimator queueing_time_estimator; | |
394 IdleTimeEstimator idle_time_estimator; | 401 IdleTimeEstimator idle_time_estimator; |
395 ThreadLoadTracker background_main_thread_load_tracker; | 402 ThreadLoadTracker background_main_thread_load_tracker; |
396 ThreadLoadTracker foreground_main_thread_load_tracker; | 403 ThreadLoadTracker foreground_main_thread_load_tracker; |
397 UseCase current_use_case; | 404 UseCase current_use_case; |
398 Policy current_policy; | 405 Policy current_policy; |
399 base::TimeTicks current_policy_expiration_time; | 406 base::TimeTicks current_policy_expiration_time; |
400 base::TimeTicks estimated_next_frame_begin; | 407 base::TimeTicks estimated_next_frame_begin; |
408 base::TimeTicks current_task_start_time; | |
401 base::TimeDelta compositor_frame_interval; | 409 base::TimeDelta compositor_frame_interval; |
402 base::TimeDelta longest_jank_free_task_duration; | 410 base::TimeDelta longest_jank_free_task_duration; |
403 base::Optional<base::TimeTicks> last_audio_state_change; | 411 base::Optional<base::TimeTicks> last_audio_state_change; |
404 int timer_queue_suspend_count; // TIMER_TASK_QUEUE suspended if non-zero. | 412 int timer_queue_suspend_count; // TIMER_TASK_QUEUE suspended if non-zero. |
405 int navigation_task_expected_count; | 413 int navigation_task_expected_count; |
406 ExpensiveTaskPolicy expensive_task_policy; | 414 ExpensiveTaskPolicy expensive_task_policy; |
407 bool renderer_hidden; | 415 bool renderer_hidden; |
408 bool renderer_backgrounded; | 416 bool renderer_backgrounded; |
409 bool renderer_suspended; | 417 bool renderer_suspended; |
410 bool timer_queue_suspension_when_backgrounded_enabled; | 418 bool timer_queue_suspension_when_backgrounded_enabled; |
411 bool timer_queue_suspended_when_backgrounded; | 419 bool timer_queue_suspended_when_backgrounded; |
412 bool was_shutdown; | 420 bool was_shutdown; |
413 bool loading_tasks_seem_expensive; | 421 bool loading_tasks_seem_expensive; |
414 bool timer_tasks_seem_expensive; | 422 bool timer_tasks_seem_expensive; |
415 bool touchstart_expected_soon; | 423 bool touchstart_expected_soon; |
416 bool have_seen_a_begin_main_frame; | 424 bool have_seen_a_begin_main_frame; |
417 bool have_reported_blocking_intervention_in_current_policy; | 425 bool have_reported_blocking_intervention_in_current_policy; |
418 bool have_reported_blocking_intervention_since_navigation; | 426 bool have_reported_blocking_intervention_since_navigation; |
419 bool has_visible_render_widget_with_touch_handler; | 427 bool has_visible_render_widget_with_touch_handler; |
420 bool begin_frame_not_expected_soon; | 428 bool begin_frame_not_expected_soon; |
421 bool in_idle_period_for_testing; | 429 bool in_idle_period_for_testing; |
422 bool use_virtual_time; | 430 bool use_virtual_time; |
423 bool is_audio_playing; | 431 bool is_audio_playing; |
424 std::set<WebViewSchedulerImpl*> web_view_schedulers; // Not owned. | 432 std::set<WebViewSchedulerImpl*> web_view_schedulers; // Not owned. |
425 RAILModeObserver* rail_mode_observer; // Not owned. | 433 RAILModeObserver* rail_mode_observer; // Not owned. |
426 }; | 434 }; |
427 | 435 |
428 struct AnyThread { | 436 struct AnyThread { |
429 AnyThread(); | 437 AnyThread(RendererSchedulerImpl* renderer_scheduler_impl); |
alex clarke (OOO till 29th)
2016/11/14 17:00:17
explicit
tdresser
2016/12/15 13:17:00
Done.
| |
430 ~AnyThread(); | 438 ~AnyThread(); |
431 | 439 |
432 base::TimeTicks last_idle_period_end_time; | 440 base::TimeTicks last_idle_period_end_time; |
433 base::TimeTicks rails_loading_priority_deadline; | 441 base::TimeTicks rails_loading_priority_deadline; |
434 base::TimeTicks fling_compositor_escalation_deadline; | 442 base::TimeTicks fling_compositor_escalation_deadline; |
435 UserModel user_model; | 443 UserModel user_model; |
436 bool awaiting_touch_start_response; | 444 bool awaiting_touch_start_response; |
437 bool in_idle_period; | 445 bool in_idle_period; |
438 bool begin_main_frame_on_critical_path; | 446 bool begin_main_frame_on_critical_path; |
439 bool last_gesture_was_compositor_driven; | 447 bool last_gesture_was_compositor_driven; |
440 bool default_gesture_prevented; | 448 bool default_gesture_prevented; |
441 bool have_seen_touchstart; | 449 bool have_seen_touchstart; |
442 }; | 450 }; |
443 | 451 |
444 struct CompositorThreadOnly { | 452 struct CompositorThreadOnly { |
445 CompositorThreadOnly(); | 453 CompositorThreadOnly(); |
446 ~CompositorThreadOnly(); | 454 ~CompositorThreadOnly(); |
447 | 455 |
448 WebInputEvent::Type last_input_type; | 456 WebInputEvent::Type last_input_type; |
457 bool main_thread_seems_unresponsive; | |
449 std::unique_ptr<base::ThreadChecker> compositor_thread_checker; | 458 std::unique_ptr<base::ThreadChecker> compositor_thread_checker; |
450 | 459 |
451 void CheckOnValidThread() { | 460 void CheckOnValidThread() { |
452 #if DCHECK_IS_ON() | 461 #if DCHECK_IS_ON() |
453 // We don't actually care which thread this called from, just so long as | 462 // We don't actually care which thread this called from, just so long as |
454 // its consistent. | 463 // its consistent. |
455 if (!compositor_thread_checker) | 464 if (!compositor_thread_checker) |
456 compositor_thread_checker.reset(new base::ThreadChecker()); | 465 compositor_thread_checker.reset(new base::ThreadChecker()); |
457 DCHECK(compositor_thread_checker->CalledOnValidThread()); | 466 DCHECK(compositor_thread_checker->CalledOnValidThread()); |
458 #endif | 467 #endif |
(...skipping 24 matching lines...) Expand all Loading... | |
483 } | 492 } |
484 | 493 |
485 // Don't access compositor_thread_only_, instead use CompositorThreadOnly(). | 494 // Don't access compositor_thread_only_, instead use CompositorThreadOnly(). |
486 CompositorThreadOnly compositor_thread_only_; | 495 CompositorThreadOnly compositor_thread_only_; |
487 CompositorThreadOnly& CompositorThreadOnly() { | 496 CompositorThreadOnly& CompositorThreadOnly() { |
488 compositor_thread_only_.CheckOnValidThread(); | 497 compositor_thread_only_.CheckOnValidThread(); |
489 return compositor_thread_only_; | 498 return compositor_thread_only_; |
490 } | 499 } |
491 | 500 |
492 PollableThreadSafeFlag policy_may_need_update_; | 501 PollableThreadSafeFlag policy_may_need_update_; |
502 // The maximum expected queueing time before the main thread is considered | |
503 // unresponsive. | |
504 base::TimeDelta main_thread_responsiveness_threshold_; | |
Sami
2016/11/14 21:16:45
Do you still need this given the constant is a Tim
tdresser
2016/12/15 13:17:00
There's nothing worse than trying to land a change
| |
505 | |
493 base::WeakPtrFactory<RendererSchedulerImpl> weak_factory_; | 506 base::WeakPtrFactory<RendererSchedulerImpl> weak_factory_; |
494 | 507 |
495 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImpl); | 508 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImpl); |
496 }; | 509 }; |
497 | 510 |
498 } // namespace scheduler | 511 } // namespace scheduler |
499 } // namespace blink | 512 } // namespace blink |
500 | 513 |
501 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDU LER_IMPL_H_ | 514 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDU LER_IMPL_H_ |
OLD | NEW |