Bug 1455974 - Clear the client-side shared frame metrics data on shutdown with WR as well. r?sotaro
There's some cleanup happening in CompositorBridgeChild to release the
shared frame metrics when the client side is destroyed. However the code
is specific to PLayerTransaction, and is missing for the WR codepath.
This patch extracts the code to a helper and ensures that it runs for
the WR equivalent codepath.
MozReview-Commit-ID: ENJ349u0PTc
--- a/gfx/layers/ipc/CompositorBridgeChild.cpp
+++ b/gfx/layers/ipc/CompositorBridgeChild.cpp
@@ -322,23 +322,17 @@ CompositorBridgeChild::AllocPLayerTransa
return c;
}
bool
CompositorBridgeChild::DeallocPLayerTransactionChild(PLayerTransactionChild* actor)
{
LayersId childId = static_cast<LayerTransactionChild*>(actor)->GetId();
-
- for (auto iter = mFrameMetricsTable.Iter(); !iter.Done(); iter.Next()) {
- nsAutoPtr<SharedFrameMetricsData>& data = iter.Data();
- if (data->GetLayersId() == childId) {
- iter.Remove();
- }
- }
+ ClearSharedFrameMetricsData(childId);
static_cast<LayerTransactionChild*>(actor)->ReleaseIPDLReference();
return true;
}
mozilla::ipc::IPCResult
CompositorBridgeChild::RecvInvalidateLayers(const LayersId& aLayersId)
{
if (mLayerManager) {
@@ -1106,20 +1100,32 @@ CompositorBridgeChild::AllocPWebRenderBr
child->AddIPDLReference();
return child;
}
bool
CompositorBridgeChild::DeallocPWebRenderBridgeChild(PWebRenderBridgeChild* aActor)
{
WebRenderBridgeChild* child = static_cast<WebRenderBridgeChild*>(aActor);
+ ClearSharedFrameMetricsData(wr::AsLayersId(child->GetPipeline()));
child->ReleaseIPDLReference();
return true;
}
+void
+CompositorBridgeChild::ClearSharedFrameMetricsData(LayersId aLayersId)
+{
+ for (auto iter = mFrameMetricsTable.Iter(); !iter.Done(); iter.Next()) {
+ nsAutoPtr<SharedFrameMetricsData>& data = iter.Data();
+ if (data->GetLayersId() == aLayersId) {
+ iter.Remove();
+ }
+ }
+}
+
uint64_t
CompositorBridgeChild::GetNextResourceId()
{
++mResourceId;
MOZ_RELEASE_ASSERT(mResourceId != UINT32_MAX);
uint64_t id = mIdNamespace;
id = (id << 32) | mResourceId;
--- a/gfx/layers/ipc/CompositorBridgeChild.h
+++ b/gfx/layers/ipc/CompositorBridgeChild.h
@@ -319,16 +319,18 @@ private:
const uint64_t& aEpoch,
const bool& aActive) override;
virtual mozilla::ipc::IPCResult
RecvNotifyWebRenderError(const WebRenderError& aError) override;
uint64_t GetNextResourceId();
+ void ClearSharedFrameMetricsData(LayersId aLayersId);
+
// Class used to store the shared FrameMetrics, mutex, and APZCId in a hash table
class SharedFrameMetricsData {
public:
SharedFrameMetricsData(
const mozilla::ipc::SharedMemoryBasic::Handle& metrics,
const CrossProcessMutexHandle& handle,
const LayersId& aLayersId,
const uint32_t& aAPZCId);