summaryrefslogtreecommitdiffstats
path: root/cc/scheduler/begin_frame_source.cc
diff options
context:
space:
mode:
authorboliu <boliu@chromium.org>2016-01-13 11:27:37 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-13 19:28:58 +0000
commit0c1f91d8ae18676091fbe783beded96f862ab9b0 (patch)
tree3cd8dae324858a033be538442b71e7532b043ebb /cc/scheduler/begin_frame_source.cc
parent2a18021a2ac515497ae64bd9535d386fb6da890b (diff)
downloadchromium_src-0c1f91d8ae18676091fbe783beded96f862ab9b0.zip
chromium_src-0c1f91d8ae18676091fbe783beded96f862ab9b0.tar.gz
chromium_src-0c1f91d8ae18676091fbe783beded96f862ab9b0.tar.bz2
Add begin frame paused signal
This avoids a deadlock situation in android webview where begin frames have stopped, but the blink main thread is blocked indefinitely waiting for activation. See bug for details. Plumb a signal that the BeginFrameSource is paused directly through BeginFrameSourceObserver, and force activate any pending activations when paused. This is similar to when compositor becomes invisible, but BFS allows webview send the signal without a hop to blink main thread. BUG=539373 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1536353003 Cr-Commit-Position: refs/heads/master@{#369238}
Diffstat (limited to 'cc/scheduler/begin_frame_source.cc')
-rw-r--r--cc/scheduler/begin_frame_source.cc15
1 files changed, 15 insertions, 0 deletions
diff --git a/cc/scheduler/begin_frame_source.cc b/cc/scheduler/begin_frame_source.cc
index 17b4a26..d96ef4e 100644
--- a/cc/scheduler/begin_frame_source.cc
+++ b/cc/scheduler/begin_frame_source.cc
@@ -53,6 +53,7 @@ void BeginFrameObserverBase::AsValueInto(
BeginFrameSourceBase::BeginFrameSourceBase()
: observer_(NULL),
needs_begin_frames_(false),
+ paused_(false),
inside_as_value_into_(false) {
DCHECK(!observer_);
DCHECK_EQ(inside_as_value_into_, false);
@@ -82,6 +83,8 @@ void BeginFrameSourceBase::AddObserver(BeginFrameObserver* obs) {
obs);
DCHECK(!observer_);
observer_ = obs;
+ if (observer_)
+ return observer_->OnBeginFrameSourcePausedChanged(paused_);
}
void BeginFrameSourceBase::RemoveObserver(BeginFrameObserver* obs) {
@@ -105,6 +108,14 @@ void BeginFrameSourceBase::CallOnBeginFrame(const BeginFrameArgs& args) {
}
}
+void BeginFrameSourceBase::SetBeginFrameSourcePaused(bool paused) {
+ if (paused_ == paused)
+ return;
+ paused_ = paused;
+ if (observer_)
+ return observer_->OnBeginFrameSourcePausedChanged(paused_);
+}
+
// Tracing support
void BeginFrameSourceBase::AsValueInto(
base::trace_event::TracedValue* dict) const {
@@ -381,6 +392,10 @@ const BeginFrameArgs BeginFrameSourceMultiplexer::LastUsedBeginFrameArgs()
return BeginFrameArgs();
}
+void BeginFrameSourceMultiplexer::OnBeginFrameSourcePausedChanged(bool paused) {
+ BeginFrameSourceBase::SetBeginFrameSourcePaused(paused);
+}
+
// BeginFrameSource support
void BeginFrameSourceMultiplexer::OnNeedsBeginFramesChange(
bool needs_begin_frames) {