Bug 1449982 - Don't hold the sIndirectLayerTreesLock unnecessarily while notifying APZ of a layer tree removal. r?botond
MozReview-Commit-ID: 2OqbmMHCxn9
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -1823,28 +1823,32 @@ Maybe<TimeStamp>
CompositorBridgeParent::GetTestingTimeStamp() const
{
return mTestTime;
}
void
EraseLayerState(LayersId aId)
{
- MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ RefPtr<APZUpdater> apz;
- auto iter = sIndirectLayerTrees.find(aId);
- if (iter != sIndirectLayerTrees.end()) {
- CompositorBridgeParent* parent = iter->second.mParent;
- if (parent) {
- if (RefPtr<APZUpdater> apz = parent->GetAPZUpdater()) {
- apz->NotifyLayerTreeRemoved(aId);
+ { // scope lock
+ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ auto iter = sIndirectLayerTrees.find(aId);
+ if (iter != sIndirectLayerTrees.end()) {
+ CompositorBridgeParent* parent = iter->second.mParent;
+ if (parent) {
+ apz = parent->GetAPZUpdater();
}
+ sIndirectLayerTrees.erase(iter);
}
+ }
- sIndirectLayerTrees.erase(iter);
+ if (apz) {
+ apz->NotifyLayerTreeRemoved(aId);
}
}
/*static*/ void
CompositorBridgeParent::DeallocateLayerTreeId(LayersId aId)
{
MOZ_ASSERT(NS_IsMainThread());
// Here main thread notifies compositor to remove an element from