diff options
-rw-r--r-- | chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc | 16 | ||||
-rw-r--r-- | chromium/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h | 1 |
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, |