Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: src/core/SkResourceCache.cpp

Issue 561953002: Make SkBitmapCache remove invalid bitmaps from the SkResourceCache. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: cache: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/core/SkResourceCache.h ('k') | tests/SkResourceCacheTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkChecksum.h" 8 #include "SkChecksum.h"
9 #include "SkResourceCache.h" 9 #include "SkResourceCache.h"
10 #include "SkMipMap.h" 10 #include "SkMipMap.h"
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 // We're under our lock, and we're the only possible mutator, so unconsting is fine. 279 // We're under our lock, and we're the only possible mutator, so unconsting is fine.
280 const_cast<Rec*>(rec)->fLockCount -= 1; 280 const_cast<Rec*>(rec)->fLockCount -= 1;
281 281
282 // we may have been over-budget, but now have released something, so check 282 // we may have been over-budget, but now have released something, so check
283 // if we should purge. 283 // if we should purge.
284 if (0 == rec->fLockCount) { 284 if (0 == rec->fLockCount) {
285 this->purgeAsNeeded(); 285 this->purgeAsNeeded();
286 } 286 }
287 } 287 }
288 288
289 void SkResourceCache::remove(Rec* rec) {
290 SkASSERT(0 == rec->fLockCount);
291
292 size_t used = rec->bytesUsed();
293 SkASSERT(used <= fTotalBytesUsed);
294
295 this->detach(rec);
296 #ifdef USE_HASH
297 fHash->remove(rec->getKey());
298 #endif
299
300 SkDELETE(rec);
301
302 fTotalBytesUsed -= used;
303 fCount -= 1;
304 }
305
289 void SkResourceCache::purgeAsNeeded() { 306 void SkResourceCache::purgeAsNeeded() {
290 size_t byteLimit; 307 size_t byteLimit;
291 int countLimit; 308 int countLimit;
292 309
293 if (fDiscardableFactory) { 310 if (fDiscardableFactory) {
294 countLimit = SK_DISCARDABLEMEMORY_SCALEDIMAGECACHE_COUNT_LIMIT; 311 countLimit = SK_DISCARDABLEMEMORY_SCALEDIMAGECACHE_COUNT_LIMIT;
295 byteLimit = SK_MaxU32; // no limit based on bytes 312 byteLimit = SK_MaxU32; // no limit based on bytes
296 } else { 313 } else {
297 countLimit = SK_MaxS32; // no limit based on count 314 countLimit = SK_MaxS32; // no limit based on count
298 byteLimit = fTotalByteLimit; 315 byteLimit = fTotalByteLimit;
299 } 316 }
300 317
301 size_t bytesUsed = fTotalBytesUsed;
302 int countUsed = fCount;
303
304 Rec* rec = fTail; 318 Rec* rec = fTail;
305 while (rec) { 319 while (rec) {
306 if (bytesUsed < byteLimit && countUsed < countLimit) { 320 if (fTotalBytesUsed < byteLimit && fCount < countLimit) {
307 break; 321 break;
308 } 322 }
309 323
310 Rec* prev = rec->fPrev; 324 Rec* prev = rec->fPrev;
311 if (0 == rec->fLockCount) { 325 if (0 == rec->fLockCount) {
312 size_t used = rec->bytesUsed(); 326 this->remove(rec);
313 SkASSERT(used <= bytesUsed);
314 this->detach(rec);
315 #ifdef USE_HASH
316 fHash->remove(rec->getKey());
317 #endif
318
319 SkDELETE(rec);
320
321 bytesUsed -= used;
322 countUsed -= 1;
323 } 327 }
324 rec = prev; 328 rec = prev;
325 } 329 }
326
327 fTotalBytesUsed = bytesUsed;
328 fCount = countUsed;
329 } 330 }
330 331
331 size_t SkResourceCache::setTotalByteLimit(size_t newLimit) { 332 size_t SkResourceCache::setTotalByteLimit(size_t newLimit) {
332 size_t prevLimit = fTotalByteLimit; 333 size_t prevLimit = fTotalByteLimit;
333 fTotalByteLimit = newLimit; 334 fTotalByteLimit = newLimit;
334 if (newLimit < prevLimit) { 335 if (newLimit < prevLimit) {
335 this->purgeAsNeeded(); 336 this->purgeAsNeeded();
336 } 337 }
337 return prevLimit; 338 return prevLimit;
338 } 339 }
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 return gResourceCache; 500 return gResourceCache;
500 } 501 }
501 502
502 void SkResourceCache::Unlock(SkResourceCache::ID id) { 503 void SkResourceCache::Unlock(SkResourceCache::ID id) {
503 SkAutoMutexAcquire am(gMutex); 504 SkAutoMutexAcquire am(gMutex);
504 get_cache()->unlock(id); 505 get_cache()->unlock(id);
505 506
506 // get_cache()->dump(); 507 // get_cache()->dump();
507 } 508 }
508 509
510 void SkResourceCache::Remove(SkResourceCache::ID id) {
511 SkAutoMutexAcquire am(gMutex);
512 SkASSERT(id);
513
514 #ifdef SK_DEBUG
515 {
516 bool found = false;
517 Rec* rec = get_cache()->fHead;
518 while (rec != NULL) {
519 if (rec == id) {
520 found = true;
521 break;
522 }
523 rec = rec->fNext;
524 }
525 SkASSERT(found);
526 }
527 #endif
528 const Rec* rec = id;
529 get_cache()->remove(const_cast<Rec*>(rec));
530 }
531
509 size_t SkResourceCache::GetTotalBytesUsed() { 532 size_t SkResourceCache::GetTotalBytesUsed() {
510 SkAutoMutexAcquire am(gMutex); 533 SkAutoMutexAcquire am(gMutex);
511 return get_cache()->getTotalBytesUsed(); 534 return get_cache()->getTotalBytesUsed();
512 } 535 }
513 536
514 size_t SkResourceCache::GetTotalByteLimit() { 537 size_t SkResourceCache::GetTotalByteLimit() {
515 SkAutoMutexAcquire am(gMutex); 538 SkAutoMutexAcquire am(gMutex);
516 return get_cache()->getTotalByteLimit(); 539 return get_cache()->getTotalByteLimit();
517 } 540 }
518 541
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 } 596 }
574 597
575 size_t SkGraphics::GetResourceCacheSingleAllocationByteLimit() { 598 size_t SkGraphics::GetResourceCacheSingleAllocationByteLimit() {
576 return SkResourceCache::GetSingleAllocationByteLimit(); 599 return SkResourceCache::GetSingleAllocationByteLimit();
577 } 600 }
578 601
579 size_t SkGraphics::SetResourceCacheSingleAllocationByteLimit(size_t newLimit) { 602 size_t SkGraphics::SetResourceCacheSingleAllocationByteLimit(size_t newLimit) {
580 return SkResourceCache::SetSingleAllocationByteLimit(newLimit); 603 return SkResourceCache::SetSingleAllocationByteLimit(newLimit);
581 } 604 }
582 605
OLDNEW
« no previous file with comments | « src/core/SkResourceCache.h ('k') | tests/SkResourceCacheTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698