diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkImageFilter.cpp | 14 | ||||
-rw-r--r-- | src/core/SkPixelRef.cpp | 15 | ||||
-rw-r--r-- | src/core/SkResourceCache.cpp | 2 |
3 files changed, 31 insertions, 0 deletions
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(); } |