diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-12 21:37:25 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-12 21:37:25 +0000 |
commit | fa7fd80ec36103351c32a7a1f235a6095110c39c (patch) | |
tree | 53109d6526151a6055eadd5e84f6ba5ebdbeb8dc /src/core/SkScaledImageCache.cpp | |
parent | e4fafb146e85cdfcf9d5418597b6818aa0754ada (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.cpp | 41 |
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" |