diff options
author | danakj <danakj@chromium.org> | 2014-09-11 10:49:52 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-11 10:49:52 -0700 |
commit | 790ffe3feb90370318f42b28eb9c6af6e38cd4f9 (patch) | |
tree | 57b311f69b8ac26a87bcebf843bdac301cf5efb1 /src/core/SkResourceCache.cpp | |
parent | 33a30503d76fdd989358cedd78445ba96bb809dd (diff) |
Make SkBitmapCache remove invalid bitmaps from the SkResourceCache.
This adds SkResourceCache::Remove() which will remove a resource from
its cache. The resource is required to be unlocked at the time Remove()
is called.
Then SkBitmapCache::Find() makes use of this to Remove() bitmaps from
the cache whose pixels have been evicted. This allows the bitmap to be
re-added to the cache with pixels again.
After this change, background a tab (and discarding all the bitmaps'
contents) no longer disables image caching for those discarded images
once the tab is visible again.
BUG=skia:2926
NOTRY=true
R=reed@android.com, tomhudson@google.com, reed@google.com
Author: danakj@chromium.org
Review URL: https://codereview.chromium.org/561953002
Diffstat (limited to 'src/core/SkResourceCache.cpp')
-rw-r--r-- | src/core/SkResourceCache.cpp | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp index 73f788cd17..6400e8a71e 100644 --- a/src/core/SkResourceCache.cpp +++ b/src/core/SkResourceCache.cpp @@ -286,6 +286,23 @@ void SkResourceCache::unlock(SkResourceCache::ID id) { } } +void SkResourceCache::remove(Rec* rec) { + SkASSERT(0 == rec->fLockCount); + + size_t used = rec->bytesUsed(); + SkASSERT(used <= fTotalBytesUsed); + + this->detach(rec); +#ifdef USE_HASH + fHash->remove(rec->getKey()); +#endif + + SkDELETE(rec); + + fTotalBytesUsed -= used; + fCount -= 1; +} + void SkResourceCache::purgeAsNeeded() { size_t byteLimit; int countLimit; @@ -298,34 +315,18 @@ void SkResourceCache::purgeAsNeeded() { byteLimit = fTotalByteLimit; } - size_t bytesUsed = fTotalBytesUsed; - int countUsed = fCount; - Rec* rec = fTail; while (rec) { - if (bytesUsed < byteLimit && countUsed < countLimit) { + if (fTotalBytesUsed < byteLimit && fCount < countLimit) { break; } Rec* prev = rec->fPrev; if (0 == rec->fLockCount) { - size_t used = rec->bytesUsed(); - SkASSERT(used <= bytesUsed); - this->detach(rec); -#ifdef USE_HASH - fHash->remove(rec->getKey()); -#endif - - SkDELETE(rec); - - bytesUsed -= used; - countUsed -= 1; + this->remove(rec); } rec = prev; } - - fTotalBytesUsed = bytesUsed; - fCount = countUsed; } size_t SkResourceCache::setTotalByteLimit(size_t newLimit) { @@ -506,6 +507,28 @@ void SkResourceCache::Unlock(SkResourceCache::ID id) { // get_cache()->dump(); } +void SkResourceCache::Remove(SkResourceCache::ID id) { + SkAutoMutexAcquire am(gMutex); + SkASSERT(id); + +#ifdef SK_DEBUG + { + bool found = false; + Rec* rec = get_cache()->fHead; + while (rec != NULL) { + if (rec == id) { + found = true; + break; + } + rec = rec->fNext; + } + SkASSERT(found); + } +#endif + const Rec* rec = id; + get_cache()->remove(const_cast<Rec*>(rec)); +} + size_t SkResourceCache::GetTotalBytesUsed() { SkAutoMutexAcquire am(gMutex); return get_cache()->getTotalBytesUsed(); |