From 2e1cf8efa1ab1116ea96beed8f749178ffd7f710 Mon Sep 17 00:00:00 2001 From: Matt Woodrow Date: Wed, 27 Aug 2014 10:57:49 +1200 Subject: [PATCH] Bug 1047945 - Delete the TileExpiry object at shutdown to avoid leak warnings. r=BenWa --- gfx/layers/client/TiledContentClient.cpp | 38 +++++++++++++++++++----- gfx/thebes/gfxPlatform.cpp | 8 +++-- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/gfx/layers/client/TiledContentClient.cpp b/gfx/layers/client/TiledContentClient.cpp index d7a588fc45ad..e85d093c74b8 100644 --- a/gfx/layers/client/TiledContentClient.cpp +++ b/gfx/layers/client/TiledContentClient.cpp @@ -30,6 +30,7 @@ #include "gfx2DGlue.h" #include "LayersLogging.h" #include "UnitTransforms.h" // for TransformTo +#include "mozilla/UniquePtr.h" // This is the minimum area that we deem reasonable to copy from the front buffer to the // back buffer on tile updates. If the valid region is smaller than this, we just @@ -434,28 +435,49 @@ class TileExpiry MOZ_FINAL : public nsExpirationTracker { public: TileExpiry() : nsExpirationTracker(1000) {} + + static void AddTile(TileClient* aTile) + { + if (!sTileExpiry) { + sTileExpiry = MakeUnique(); + } + + sTileExpiry->AddObject(aTile); + } + + static void RemoveTile(TileClient* aTile) + { + MOZ_ASSERT(sTileExpiry); + sTileExpiry->RemoveObject(aTile); + } + + static void Shutdown() { + sTileExpiry = nullptr; + } private: - virtual void NotifyExpired(TileClient* aTile) + virtual void NotifyExpired(TileClient* aTile) MOZ_OVERRIDE { aTile->DiscardBackBuffer(); } -}; -TileExpiry *TileExpirer() + static UniquePtr sTileExpiry; +}; +UniquePtr TileExpiry::sTileExpiry; + +void ShutdownTileCache() { - static TileExpiry * sTileExpiry = new TileExpiry(); - return sTileExpiry; + TileExpiry::Shutdown(); } void TileClient::PrivateProtector::Set(TileClient * const aContainer, RefPtr aNewValue) { if (mBuffer) { - TileExpirer()->RemoveObject(aContainer); + TileExpiry::RemoveTile(aContainer); } mBuffer = aNewValue; if (mBuffer) { - TileExpirer()->AddObject(aContainer); + TileExpiry::AddTile(aContainer); } } @@ -475,7 +497,7 @@ TileClient::~TileClient() { if (mExpirationState.IsTracked()) { MOZ_ASSERT(mBackBuffer); - TileExpirer()->RemoveObject(this); + TileExpiry::RemoveTile(this); } } diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 6a97952a598e..bc652e609cf8 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -93,13 +93,14 @@ class mozilla::gl::SkiaGLGlue : public GenericAtomicRefCounted { #include "nsIGfxInfo.h" #include "nsIXULRuntime.h" -#ifdef MOZ_WIDGET_GONK namespace mozilla { namespace layers { +#ifdef MOZ_WIDGET_GONK void InitGralloc(); -} -} #endif +void ShutdownTileCache(); +} +} using namespace mozilla; using namespace mozilla::layers; @@ -442,6 +443,7 @@ gfxPlatform::Shutdown() gfxAlphaBoxBlur::ShutdownBlurCache(); gfxGraphiteShaper::Shutdown(); gfxPlatformFontList::Shutdown(); + ShutdownTileCache(); // Free the various non-null transforms and loaded profiles ShutdownCMS();