aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkScaledImageCache.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-12 21:37:25 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-12 21:37:25 +0000
commitfa7fd80ec36103351c32a7a1f235a6095110c39c (patch)
tree53109d6526151a6055eadd5e84f6ba5ebdbeb8dc /src/core/SkScaledImageCache.cpp
parente4fafb146e85cdfcf9d5418597b6818aa0754ada (diff)
detect if the scaledimagecache returns a purged bitmap
BUG= R=scroggo@google.com Review URL: https://codereview.chromium.org/110383005 git-svn-id: http://skia.googlecode.com/svn/trunk@12654 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkScaledImageCache.cpp')
-rw-r--r--src/core/SkScaledImageCache.cpp41
1 files changed, 37 insertions, 4 deletions
diff --git a/src/core/SkScaledImageCache.cpp b/src/core/SkScaledImageCache.cpp
index b3956f4a8d..7c8b66498e 100644
--- a/src/core/SkScaledImageCache.cpp
+++ b/src/core/SkScaledImageCache.cpp
@@ -239,9 +239,18 @@ void* SkOneShotDiscardablePixelRef::onLockPixels(SkColorTable** ctable) {
return fDM->data();
}
- SkASSERT(!fIsLocked);
- fIsLocked = fDM->lock();
- return fIsLocked ? fDM->data() : NULL;
+ // A previous call to onUnlock may have deleted our DM, so check for that
+ if (NULL == fDM) {
+ return NULL;
+ }
+
+ if (!fDM->lock()) {
+ // since it failed, we delete it now, to free-up the resource
+ delete fDM;
+ fDM = NULL;
+ return NULL;
+ }
+ return fDM->data();
}
void SkOneShotDiscardablePixelRef::onUnlockPixels() {
@@ -613,6 +622,8 @@ void SkScaledImageCache::addToHead(Rec* rec) {
this->validate();
}
+///////////////////////////////////////////////////////////////////////////////
+
#ifdef SK_DEBUG
void SkScaledImageCache::validate() const {
if (NULL == fHead) {
@@ -658,6 +669,21 @@ void SkScaledImageCache::validate() const {
}
#endif
+void SkScaledImageCache::dump() const {
+ this->validate();
+
+ const Rec* rec = fHead;
+ int locked = 0;
+ while (rec) {
+ locked += rec->fLockCount > 0;
+ rec = rec->fNext;
+ }
+
+ SkDebugf("SkScaledImageCache: count=%d bytes=%d locked=%d %s\n",
+ fCount, fBytesUsed, locked,
+ fDiscardableFactory ? "discardable" : "malloc");
+}
+
///////////////////////////////////////////////////////////////////////////////
#include "SkThread.h"
@@ -730,7 +756,9 @@ SkScaledImageCache::ID* SkScaledImageCache::AddAndLockMip(const SkBitmap& orig,
void SkScaledImageCache::Unlock(SkScaledImageCache::ID* id) {
SkAutoMutexAcquire am(gMutex);
- return get_cache()->unlock(id);
+ get_cache()->unlock(id);
+
+// get_cache()->dump();
}
size_t SkScaledImageCache::GetBytesUsed() {
@@ -753,6 +781,11 @@ SkBitmap::Allocator* SkScaledImageCache::GetAllocator() {
return get_cache()->allocator();
}
+void SkScaledImageCache::Dump() {
+ SkAutoMutexAcquire am(gMutex);
+ get_cache()->dump();
+}
+
///////////////////////////////////////////////////////////////////////////////
#include "SkGraphics.h"