Bug 1460988 - Don't hold the layer trees lock while making calls that block on WR threads. r?sotaro draft
authorKartikaya Gupta <kgupta@mozilla.com>
Fri, 11 May 2018 16:36:22 -0400
changeset 794364 1b99c72a9ddf6d315508dbb333bc0665171506a1
parent 794191 4303d49c53931385892231969e40048f096b4d4c
push id109658
push userkgupta@mozilla.com
push dateFri, 11 May 2018 20:36:57 +0000
reviewerssotaro
bugs1460988
milestone62.0a1
Bug 1460988 - Don't hold the layer trees lock while making calls that block on WR threads. r?sotaro MozReview-Commit-ID: BKNf5wpG1br
gfx/layers/ipc/CompositorBridgeParent.cpp
--- 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;
     }
   }