diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc | 16 |
1 files changed, 14 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&) { |