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

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

Issue 2273703002: Force events to be non blocking if main thread is unresponsive. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add tests, fix bugs. Created 4 years, 1 month 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 #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
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
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
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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698