aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-05-20 13:22:58 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-05-20 13:22:58 -0700
commit67ca2a93f9269768fac39be4406dc167bea6d716 (patch)
tree715dcff5a6ea63ed20794b8ba38dd2c21ee5275a
parente12fcd5fff872dc8757d3dde56338ee75b6a9fb2 (diff)
purge imagefilter cache so we can better track leaks
-rw-r--r--include/core/SkImageFilter.h4
-rw-r--r--src/core/SkImageFilter.cpp14
-rw-r--r--src/core/SkPixelRef.cpp15
-rw-r--r--src/core/SkResourceCache.cpp2
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();
}