Bug 1460988 - Don't hold the layer trees lock while making calls that block on WR threads. r?sotaro
MozReview-Commit-ID: BKNf5wpG1br
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -490,24 +490,29 @@ CompositorBridgeParent::StopAndClearReso
lts->mParent = nullptr;
});
mLayerManager->Destroy();
mLayerManager = nullptr;
mCompositionManager = nullptr;
}
if (mWrBridge) {
- MonitorAutoLock lock(*sIndirectLayerTreesLock);
- ForEachIndirectLayerTree([] (LayerTreeState* lts, LayersId) -> void {
- if (lts->mWrBridge) {
- lts->mWrBridge->Destroy();
- lts->mWrBridge = nullptr;
- }
- lts->mParent = nullptr;
- });
+ { // scope lock
+ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ ForEachIndirectLayerTree([] (LayerTreeState* lts, LayersId) -> void {
+ if (lts->mWrBridge) {
+ lts->mWrBridge->Destroy();
+ lts->mWrBridge = nullptr;
+ }
+ lts->mParent = nullptr;
+ });
+ }
+
+ // Ensure we are not holding the sIndirectLayerTreesLock here because we
+ // are going to block on WR threads in order to shut it down properly.
mWrBridge->Destroy();
mWrBridge = nullptr;
if (mAsyncImageManager) {
mAsyncImageManager->Destroy();
// WebRenderAPI should be already destructed
mAsyncImageManager = nullptr;
}
}