summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc16
-rw-r--r--chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h1
2 files changed, 15 insertions, 2 deletions
diff --git a/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc b/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
index ed4af1277ae..cfb36087beb 100644
--- a/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
+++ b/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
@@ -153,6 +153,7 @@ void LayerTreeView::SetLayerTreeFrameSink(
layer_tree_host_->SetRenderFrameObserver(
std::move(render_frame_metadata_observer));
}
+ layer_tree_frame_sink_init_failures = 0;
layer_tree_host_->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink));
}
@@ -270,9 +271,20 @@ void LayerTreeView::DidFailToInitializeLayerTreeFrameSink() {
return;
}
layer_tree_frame_sink_request_failed_while_invisible_ = false;
- layer_tree_host_->GetTaskRunnerProvider()->MainThreadTaskRunner()->PostTask(
+
+ // Guard against infinite loop of trying to request a new sink, and constantly failing,
+ // and trying again, when the child's main process was killed / crashed. This allows the
+ // orhpan render processes to quit gracefully, isntead of spinning the CPU forever.
+ ++layer_tree_frame_sink_init_failures;
+ if (layer_tree_frame_sink_init_failures > 10) {
+ DCHECK(false); // should not really happen, better to crash then stay forver.
+ return;
+ }
+
+ //in case of dead gpu channel there no chance to recover without some delay
+ layer_tree_host_->GetTaskRunnerProvider()->MainThreadTaskRunner()->PostDelayedTask(
FROM_HERE, base::BindOnce(&LayerTreeView::RequestNewLayerTreeFrameSink,
- weak_factory_.GetWeakPtr()));
+ weak_factory_.GetWeakPtr()), base::Milliseconds(10));
}
void LayerTreeView::WillCommit(const cc::CommitState&) {
diff --git a/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h b/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h
index ddd785f00b8..56f8fc07f35 100644
--- a/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h
+++ b/chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h
@@ -151,6 +151,7 @@ class PLATFORM_EXPORT LayerTreeView
// This class should do nothing and access no pointers once this value becomes
// true.
bool layer_tree_frame_sink_request_failed_while_invisible_ = false;
+ int layer_tree_frame_sink_init_failures = 0;
base::circular_deque<
std::pair<uint32_t,