diff options
author | 2015-05-20 13:22:58 -0700 | |
---|---|---|
committer | 2015-05-20 13:22:58 -0700 | |
commit | 67ca2a93f9269768fac39be4406dc167bea6d716 (patch) | |
tree | 715dcff5a6ea63ed20794b8ba38dd2c21ee5275a | |
parent | e12fcd5fff872dc8757d3dde56338ee75b6a9fb2 (diff) |
purge imagefilter cache so we can better track leaks
BUG=skia:
Review URL: https://codereview.chromium.org/1148973002
-rw-r--r-- | include/core/SkImageFilter.h | 4 | ||||
-rw-r--r-- | src/core/SkImageFilter.cpp | 14 | ||||
-rw-r--r-- | src/core/SkPixelRef.cpp | 15 | ||||
-rw-r--r-- | src/core/SkResourceCache.cpp | 2 |
4 files changed, 35 insertions, 0 deletions
diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h index dab46ae716..b7cc07ea92 100644 --- a/include/core/SkImageFilter.h +++ b/include/core/SkImageFilter.h @@ -61,6 +61,7 @@ public: static Cache* Get(); virtual bool get(const Key& key, SkBitmap* result, SkIPoint* offset) const = 0; virtual void set(const Key& key, const SkBitmap& result, const SkIPoint& offset) = 0; + virtual void purge() {} }; class Context { @@ -342,6 +343,9 @@ protected: const SkIRect& bounds) const; private: + friend class SkGraphics; + static void PurgeCache(); + bool usesSrcInput() const { return fUsesSrcInput; } typedef SkFlattenable INHERITED; diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index 0a5aca85ed..0a5e16e1d7 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -474,6 +474,16 @@ public: removeInternal(tail); } } + + void purge() override { + SkAutoMutexAcquire mutex(fMutex); + while (fCurrentBytes > 0) { + Value* tail = fLRU.tail(); + SkASSERT(tail); + this->removeInternal(tail); + } + } + private: void removeInternal(Value* v) { fCurrentBytes -= v->fBitmap.getSize(); @@ -504,3 +514,7 @@ SK_DECLARE_STATIC_LAZY_PTR(SkImageFilter::Cache, cache, CreateCache); SkImageFilter::Cache* SkImageFilter::Cache::Get() { return cache.get(); } + +void SkImageFilter::PurgeCache() { + cache.get()->purge(); +} diff --git a/src/core/SkPixelRef.cpp b/src/core/SkPixelRef.cpp index 20a8b34f06..3191b0333b 100644 --- a/src/core/SkPixelRef.cpp +++ b/src/core/SkPixelRef.cpp @@ -10,6 +10,8 @@ #include "SkThread.h" #include "SkTraceEvent.h" +//#define SK_TRACE_PIXELREF_LIFETIME + #ifdef SK_BUILD_FOR_WIN32 // We don't have SK_BASE_MUTEX_INIT on Windows. @@ -85,6 +87,10 @@ static SkImageInfo validate_info(const SkImageInfo& info) { return info.makeAlphaType(newAlphaType); } +#ifdef SK_TRACE_PIXELREF_LIFETIME + static int32_t gInstCounter; +#endif + SkPixelRef::SkPixelRef(const SkImageInfo& info) : fInfo(validate_info(info)) #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK @@ -92,6 +98,9 @@ SkPixelRef::SkPixelRef(const SkImageInfo& info) #endif { +#ifdef SK_TRACE_PIXELREF_LIFETIME + SkDebugf(" pixelref %d\n", sk_atomic_inc(&gInstCounter)); +#endif this->setMutex(NULL); fRec.zero(); fLockCount = 0; @@ -108,6 +117,9 @@ SkPixelRef::SkPixelRef(const SkImageInfo& info, SkBaseMutex* mutex) , fStableID(next_gen_id()) #endif { +#ifdef SK_TRACE_PIXELREF_LIFETIME + SkDebugf(" pixelref %d\n", sk_atomic_inc(&gInstCounter)); +#endif this->setMutex(mutex); fRec.zero(); fLockCount = 0; @@ -118,6 +130,9 @@ SkPixelRef::SkPixelRef(const SkImageInfo& info, SkBaseMutex* mutex) } SkPixelRef::~SkPixelRef() { +#ifdef SK_TRACE_PIXELREF_LIFETIME + SkDebugf("~pixelref %d\n", sk_atomic_dec(&gInstCounter) - 1); +#endif this->callGenIDChangeListeners(); } diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp index 0fdb54b191..efe55b4838 100644 --- a/src/core/SkResourceCache.cpp +++ b/src/core/SkResourceCache.cpp @@ -618,6 +618,7 @@ void SkResourceCache::PostPurgeSharedID(uint64_t sharedID) { /////////////////////////////////////////////////////////////////////////////// #include "SkGraphics.h" +#include "SkImageFilter.h" size_t SkGraphics::GetResourceCacheTotalBytesUsed() { return SkResourceCache::GetTotalBytesUsed(); @@ -640,6 +641,7 @@ size_t SkGraphics::SetResourceCacheSingleAllocationByteLimit(size_t newLimit) { } void SkGraphics::PurgeResourceCache() { + SkImageFilter::PurgeCache(); return SkResourceCache::PurgeAll(); } |