OLD | NEW |
---|---|
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 Loading... | |
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 remove(rec); |
reed1
2014/09/11 15:11:17
nit: this->remove(rec)
danakj
2014/09/11 17:01:32
Done.
| |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |