| Index: src/core/SkResourceCache.cpp
|
| diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp
|
| index 4ed889a0aba3095900d934187f812f170217cca8..62263605dea187c95ca3864f31c9a776f2b2b7fb 100644
|
| --- a/src/core/SkResourceCache.cpp
|
| +++ b/src/core/SkResourceCache.cpp
|
| @@ -61,6 +61,8 @@ void SkResourceCache::init() {
|
| // One of these should be explicit set by the caller after we return.
|
| fTotalByteLimit = 0;
|
| fDiscardableFactory = NULL;
|
| +
|
| + fInsidePurgeAllCounter = 0;
|
| }
|
|
|
| #include "SkDiscardableMemory.h"
|
| @@ -199,7 +201,7 @@ SkResourceCache::~SkResourceCache() {
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -bool SkResourceCache::find(const Key& key, VisitorProc visitor, void* context) {
|
| +bool SkResourceCache::find(const Key& key, FindVisitor visitor, void* context) {
|
| Rec* rec = fHash->find(key);
|
| if (rec) {
|
| if (visitor(*rec, context)) {
|
| @@ -294,6 +296,34 @@ void SkResourceCache::purgeAsNeeded(bool forcePurge) {
|
| }
|
| }
|
|
|
| +void SkResourceCache::purge(const void* nameSpace, PurgeVisitor proc, void* context) {
|
| + if (this->insidePurgeAll()) {
|
| + return;
|
| + }
|
| +
|
| + // go backwards, just like purgeAsNeeded, just to make the code similar.
|
| + // could iterate either direction and still be correct.
|
| + Rec* rec = fTail;
|
| + while (rec) {
|
| + Rec* prev = rec->fPrev;
|
| + if (rec->getKey().getNamespace() == nameSpace) {
|
| + switch (proc(*rec, context)) {
|
| + case kRetainAndContinue_PurgeVisitorResult:
|
| + break;
|
| + case kPurgeAndContinue_PurgeVisitorResult:
|
| + this->remove(rec);
|
| + break;
|
| + case kRetainAndStop_PurgeVisitorResult:
|
| + return;
|
| + case kPurgeAndStop_PurgeVisitorResult:
|
| + this->remove(rec);
|
| + return;
|
| + }
|
| + }
|
| + rec = prev;
|
| + }
|
| +}
|
| +
|
| size_t SkResourceCache::setTotalByteLimit(size_t newLimit) {
|
| size_t prevLimit = fTotalByteLimit;
|
| fTotalByteLimit = newLimit;
|
| @@ -532,12 +562,17 @@ size_t SkResourceCache::GetEffectiveSingleAllocationByteLimit() {
|
| return get_cache()->getEffectiveSingleAllocationByteLimit();
|
| }
|
|
|
| +void SkResourceCache::Purge(const void* nameSpace, PurgeVisitor proc, void* context) {
|
| + SkAutoMutexAcquire am(gMutex);
|
| + return get_cache()->purge(nameSpace, proc, context);
|
| +}
|
| +
|
| void SkResourceCache::PurgeAll() {
|
| SkAutoMutexAcquire am(gMutex);
|
| return get_cache()->purgeAll();
|
| }
|
|
|
| -bool SkResourceCache::Find(const Key& key, VisitorProc visitor, void* context) {
|
| +bool SkResourceCache::Find(const Key& key, FindVisitor visitor, void* context) {
|
| SkAutoMutexAcquire am(gMutex);
|
| return get_cache()->find(key, visitor, context);
|
| }
|
|
|