Chromium Code Reviews| Index: src/core/SkResourceCache.cpp |
| diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp |
| index 73f788cd172a7ac1e6e049a5ce246d2fff92eb64..8d968ac8dea0011e7b3c1a6dac80efe41519f0a7 100644 |
| --- a/src/core/SkResourceCache.cpp |
| +++ b/src/core/SkResourceCache.cpp |
| @@ -286,6 +286,45 @@ void SkResourceCache::unlock(SkResourceCache::ID id) { |
| } |
| } |
| +void SkResourceCache::remove(SkResourceCache::ID id) { |
|
reed1
2014/09/11 13:40:30
I think we can just have remove(), and move the im
reed1
2014/09/11 14:33:32
Additionally, we probably need to actually check t
danakj
2014/09/11 14:42:29
IIUC you're suggesting that Remove() do the cast f
danakj
2014/09/11 14:42:30
I considered that, but then I ended up with "marki
|
| + SkASSERT(id); |
| + |
| +#ifdef SK_DEBUG |
| + { |
| + bool found = false; |
| + Rec* rec = fHead; |
| + while (rec != NULL) { |
| + if (rec == id) { |
| + found = true; |
| + break; |
| + } |
| + rec = rec->fNext; |
| + } |
| + SkASSERT(found); |
| + } |
| +#endif |
| + const Rec* rec = id; |
| + SkASSERT(0 == rec->fLockCount); |
| + this->purgeRec(const_cast<Rec*>(rec)); |
| +} |
| + |
| +void SkResourceCache::purgeRec(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 +337,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; |
| + purgeRec(rec); |
| } |
| rec = prev; |
| } |
| - |
| - fTotalBytesUsed = bytesUsed; |
| - fCount = countUsed; |
| } |
| size_t SkResourceCache::setTotalByteLimit(size_t newLimit) { |
| @@ -506,6 +529,11 @@ void SkResourceCache::Unlock(SkResourceCache::ID id) { |
| // get_cache()->dump(); |
| } |
| +void SkResourceCache::Remove(SkResourceCache::ID id) { |
| + SkAutoMutexAcquire am(gMutex); |
| + get_cache()->remove(id); |
| +} |
| + |
| size_t SkResourceCache::GetTotalBytesUsed() { |
| SkAutoMutexAcquire am(gMutex); |
| return get_cache()->getTotalBytesUsed(); |