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 ShouldForceEventsNonBlockingForUnresponsiveMainThread() const 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 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 scoped_refptr<TaskQueue> default_timer_task_runner_; | 364 scoped_refptr<TaskQueue> default_timer_task_runner_; |
362 | 365 |
363 // Note |virtual_time_domain_| is lazily created. | 366 // Note |virtual_time_domain_| is lazily created. |
364 std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_; | 367 std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_; |
365 | 368 |
366 base::Closure update_policy_closure_; | 369 base::Closure update_policy_closure_; |
367 DeadlineTaskRunner delayed_update_policy_runner_; | 370 DeadlineTaskRunner delayed_update_policy_runner_; |
368 CancelableClosureHolder end_renderer_hidden_idle_period_closure_; | 371 CancelableClosureHolder end_renderer_hidden_idle_period_closure_; |
369 CancelableClosureHolder suspend_timers_when_backgrounded_closure_; | 372 CancelableClosureHolder suspend_timers_when_backgrounded_closure_; |
370 | 373 |
| 374 using SeqLockQueueingTimeEstimator = |
| 375 device::SharedMemorySeqLockBuffer<QueueingTimeEstimator>; |
| 376 |
| 377 SeqLockQueueingTimeEstimator seqlock_queueing_time_estimator_; |
| 378 |
371 // We have decided to improve thread safety at the cost of some boilerplate | 379 // We have decided to improve thread safety at the cost of some boilerplate |
372 // (the accessors) for the following data members. | 380 // (the accessors) for the following data members. |
373 | 381 |
374 struct MainThreadOnly { | 382 struct MainThreadOnly { |
375 MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl, | 383 MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl, |
376 const scoped_refptr<TaskQueue>& compositor_task_runner, | 384 const scoped_refptr<TaskQueue>& compositor_task_runner, |
377 base::TickClock* time_source, | 385 base::TickClock* time_source, |
378 base::TimeTicks now); | 386 base::TimeTicks now); |
379 ~MainThreadOnly(); | 387 ~MainThreadOnly(); |
380 | 388 |
381 TaskCostEstimator loading_task_cost_estimator; | 389 TaskCostEstimator loading_task_cost_estimator; |
382 TaskCostEstimator timer_task_cost_estimator; | 390 TaskCostEstimator timer_task_cost_estimator; |
383 QueueingTimeEstimator queueing_time_estimator; | 391 // QueueingTimeEstimator queueing_time_estimator; // TODO |
384 IdleTimeEstimator idle_time_estimator; | 392 IdleTimeEstimator idle_time_estimator; |
385 ThreadLoadTracker background_main_thread_load_tracker; | 393 ThreadLoadTracker background_main_thread_load_tracker; |
386 ThreadLoadTracker foreground_main_thread_load_tracker; | 394 ThreadLoadTracker foreground_main_thread_load_tracker; |
387 UseCase current_use_case; | 395 UseCase current_use_case; |
388 Policy current_policy; | 396 Policy current_policy; |
389 base::TimeTicks current_policy_expiration_time; | 397 base::TimeTicks current_policy_expiration_time; |
390 base::TimeTicks estimated_next_frame_begin; | 398 base::TimeTicks estimated_next_frame_begin; |
| 399 base::TimeTicks current_task_start_time; |
391 base::TimeDelta compositor_frame_interval; | 400 base::TimeDelta compositor_frame_interval; |
392 base::TimeDelta longest_jank_free_task_duration; | 401 base::TimeDelta longest_jank_free_task_duration; |
393 int timer_queue_suspend_count; // TIMER_TASK_QUEUE suspended if non-zero. | 402 int timer_queue_suspend_count; // TIMER_TASK_QUEUE suspended if non-zero. |
394 int navigation_task_expected_count; | 403 int navigation_task_expected_count; |
395 ExpensiveTaskPolicy expensive_task_policy; | 404 ExpensiveTaskPolicy expensive_task_policy; |
396 bool renderer_hidden; | 405 bool renderer_hidden; |
397 bool renderer_backgrounded; | 406 bool renderer_backgrounded; |
398 bool renderer_suspended; | 407 bool renderer_suspended; |
399 bool timer_queue_suspension_when_backgrounded_enabled; | 408 bool timer_queue_suspension_when_backgrounded_enabled; |
400 bool timer_queue_suspended_when_backgrounded; | 409 bool timer_queue_suspended_when_backgrounded; |
401 bool was_shutdown; | 410 bool was_shutdown; |
402 bool loading_tasks_seem_expensive; | 411 bool loading_tasks_seem_expensive; |
403 bool timer_tasks_seem_expensive; | 412 bool timer_tasks_seem_expensive; |
404 bool touchstart_expected_soon; | 413 bool touchstart_expected_soon; |
405 bool have_seen_a_begin_main_frame; | 414 bool have_seen_a_begin_main_frame; |
406 bool have_reported_blocking_intervention_in_current_policy; | 415 bool have_reported_blocking_intervention_in_current_policy; |
407 bool have_reported_blocking_intervention_since_navigation; | 416 bool have_reported_blocking_intervention_since_navigation; |
408 bool has_visible_render_widget_with_touch_handler; | 417 bool has_visible_render_widget_with_touch_handler; |
409 bool begin_frame_not_expected_soon; | 418 bool begin_frame_not_expected_soon; |
410 bool in_idle_period_for_testing; | 419 bool in_idle_period_for_testing; |
411 bool use_virtual_time; | 420 bool use_virtual_time; |
412 std::set<WebViewSchedulerImpl*> web_view_schedulers; // Not owned. | 421 std::set<WebViewSchedulerImpl*> web_view_schedulers; // Not owned. |
413 RAILModeObserver* rail_mode_observer; // Not owned. | 422 RAILModeObserver* rail_mode_observer; // Not owned. |
414 }; | 423 }; |
415 | 424 |
416 struct AnyThread { | 425 struct AnyThread { |
417 AnyThread(); | 426 AnyThread(RendererSchedulerImpl* renderer_scheduler_impl); |
418 ~AnyThread(); | 427 ~AnyThread(); |
419 | 428 |
420 base::TimeTicks last_idle_period_end_time; | 429 base::TimeTicks last_idle_period_end_time; |
421 base::TimeTicks rails_loading_priority_deadline; | 430 base::TimeTicks rails_loading_priority_deadline; |
422 base::TimeTicks fling_compositor_escalation_deadline; | 431 base::TimeTicks fling_compositor_escalation_deadline; |
423 UserModel user_model; | 432 UserModel user_model; |
424 bool awaiting_touch_start_response; | 433 bool awaiting_touch_start_response; |
425 bool in_idle_period; | 434 bool in_idle_period; |
426 bool begin_main_frame_on_critical_path; | 435 bool begin_main_frame_on_critical_path; |
427 bool last_gesture_was_compositor_driven; | 436 bool last_gesture_was_compositor_driven; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 PollableThreadSafeFlag policy_may_need_update_; | 489 PollableThreadSafeFlag policy_may_need_update_; |
481 base::WeakPtrFactory<RendererSchedulerImpl> weak_factory_; | 490 base::WeakPtrFactory<RendererSchedulerImpl> weak_factory_; |
482 | 491 |
483 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImpl); | 492 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImpl); |
484 }; | 493 }; |
485 | 494 |
486 } // namespace scheduler | 495 } // namespace scheduler |
487 } // namespace blink | 496 } // namespace blink |
488 | 497 |
489 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDU
LER_IMPL_H_ | 498 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_SCHEDU
LER_IMPL_H_ |
OLD | NEW |