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

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

Issue 110383005: detect if the scaledimagecache returns a purged bitmap (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « src/core/SkScaledImageCache.h ('k') | no next file » | 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 "SkScaledImageCache.h" 8 #include "SkScaledImageCache.h"
9 #include "SkMipMap.h" 9 #include "SkMipMap.h"
10 #include "SkOnce.h" 10 #include "SkOnce.h"
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 SkDELETE(fDM); 232 SkDELETE(fDM);
233 } 233 }
234 234
235 void* SkOneShotDiscardablePixelRef::onLockPixels(SkColorTable** ctable) { 235 void* SkOneShotDiscardablePixelRef::onLockPixels(SkColorTable** ctable) {
236 if (fFirstTime) { 236 if (fFirstTime) {
237 // we're already locked 237 // we're already locked
238 fFirstTime = false; 238 fFirstTime = false;
239 return fDM->data(); 239 return fDM->data();
240 } 240 }
241 241
242 SkASSERT(!fIsLocked); 242 // A previous call to onUnlock may have deleted our DM, so check for that
243 fIsLocked = fDM->lock(); 243 if (NULL == fDM) {
244 return fIsLocked ? fDM->data() : NULL; 244 return NULL;
245 }
246
247 if (!fDM->lock()) {
248 // since it failed, we delete it now, to free-up the resource
249 delete fDM;
250 fDM = NULL;
251 return NULL;
252 }
253 return fDM->data();
245 } 254 }
246 255
247 void SkOneShotDiscardablePixelRef::onUnlockPixels() { 256 void SkOneShotDiscardablePixelRef::onUnlockPixels() {
248 SkASSERT(!fFirstTime); 257 SkASSERT(!fFirstTime);
249 if (fIsLocked) { 258 if (fIsLocked) {
250 fIsLocked = false; 259 fIsLocked = false;
251 fDM->unlock(); 260 fDM->unlock();
252 } 261 }
253 } 262 }
254 263
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 fHead = rec; 615 fHead = rec;
607 if (!fTail) { 616 if (!fTail) {
608 fTail = rec; 617 fTail = rec;
609 } 618 }
610 fBytesUsed += rec->bytesUsed(); 619 fBytesUsed += rec->bytesUsed();
611 fCount += 1; 620 fCount += 1;
612 621
613 this->validate(); 622 this->validate();
614 } 623 }
615 624
625 ///////////////////////////////////////////////////////////////////////////////
626
616 #ifdef SK_DEBUG 627 #ifdef SK_DEBUG
617 void SkScaledImageCache::validate() const { 628 void SkScaledImageCache::validate() const {
618 if (NULL == fHead) { 629 if (NULL == fHead) {
619 SkASSERT(NULL == fTail); 630 SkASSERT(NULL == fTail);
620 SkASSERT(0 == fBytesUsed); 631 SkASSERT(0 == fBytesUsed);
621 return; 632 return;
622 } 633 }
623 634
624 if (fHead == fTail) { 635 if (fHead == fTail) {
625 SkASSERT(NULL == fHead->fPrev); 636 SkASSERT(NULL == fHead->fPrev);
(...skipping 25 matching lines...) Expand all
651 SkASSERT(used >= rec->bytesUsed()); 662 SkASSERT(used >= rec->bytesUsed());
652 used -= rec->bytesUsed(); 663 used -= rec->bytesUsed();
653 rec = rec->fPrev; 664 rec = rec->fPrev;
654 } 665 }
655 666
656 SkASSERT(0 == count); 667 SkASSERT(0 == count);
657 SkASSERT(0 == used); 668 SkASSERT(0 == used);
658 } 669 }
659 #endif 670 #endif
660 671
672 void SkScaledImageCache::dump() const {
673 this->validate();
674
675 const Rec* rec = fHead;
676 int locked = 0;
677 while (rec) {
678 locked += rec->fLockCount > 0;
679 rec = rec->fNext;
680 }
681
682 SkDebugf("SkScaledImageCache: count=%d bytes=%d locked=%d %s\n",
683 fCount, fBytesUsed, locked,
684 fDiscardableFactory ? "discardable" : "malloc");
685 }
686
661 /////////////////////////////////////////////////////////////////////////////// 687 ///////////////////////////////////////////////////////////////////////////////
662 688
663 #include "SkThread.h" 689 #include "SkThread.h"
664 690
665 SK_DECLARE_STATIC_MUTEX(gMutex); 691 SK_DECLARE_STATIC_MUTEX(gMutex);
666 692
667 static void create_cache(SkScaledImageCache** cache) { 693 static void create_cache(SkScaledImageCache** cache) {
668 #ifdef SK_USE_DISCARDABLE_SCALEDIMAGECACHE 694 #ifdef SK_USE_DISCARDABLE_SCALEDIMAGECACHE
669 *cache = SkNEW_ARGS(SkScaledImageCache, (SkDiscardableMemory::Create)); 695 *cache = SkNEW_ARGS(SkScaledImageCache, (SkDiscardableMemory::Create));
670 #else 696 #else
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 } 749 }
724 750
725 SkScaledImageCache::ID* SkScaledImageCache::AddAndLockMip(const SkBitmap& orig, 751 SkScaledImageCache::ID* SkScaledImageCache::AddAndLockMip(const SkBitmap& orig,
726 const SkMipMap* mip) { 752 const SkMipMap* mip) {
727 SkAutoMutexAcquire am(gMutex); 753 SkAutoMutexAcquire am(gMutex);
728 return get_cache()->addAndLockMip(orig, mip); 754 return get_cache()->addAndLockMip(orig, mip);
729 } 755 }
730 756
731 void SkScaledImageCache::Unlock(SkScaledImageCache::ID* id) { 757 void SkScaledImageCache::Unlock(SkScaledImageCache::ID* id) {
732 SkAutoMutexAcquire am(gMutex); 758 SkAutoMutexAcquire am(gMutex);
733 return get_cache()->unlock(id); 759 get_cache()->unlock(id);
760
761 // get_cache()->dump();
734 } 762 }
735 763
736 size_t SkScaledImageCache::GetBytesUsed() { 764 size_t SkScaledImageCache::GetBytesUsed() {
737 SkAutoMutexAcquire am(gMutex); 765 SkAutoMutexAcquire am(gMutex);
738 return get_cache()->getBytesUsed(); 766 return get_cache()->getBytesUsed();
739 } 767 }
740 768
741 size_t SkScaledImageCache::GetByteLimit() { 769 size_t SkScaledImageCache::GetByteLimit() {
742 SkAutoMutexAcquire am(gMutex); 770 SkAutoMutexAcquire am(gMutex);
743 return get_cache()->getByteLimit(); 771 return get_cache()->getByteLimit();
744 } 772 }
745 773
746 size_t SkScaledImageCache::SetByteLimit(size_t newLimit) { 774 size_t SkScaledImageCache::SetByteLimit(size_t newLimit) {
747 SkAutoMutexAcquire am(gMutex); 775 SkAutoMutexAcquire am(gMutex);
748 return get_cache()->setByteLimit(newLimit); 776 return get_cache()->setByteLimit(newLimit);
749 } 777 }
750 778
751 SkBitmap::Allocator* SkScaledImageCache::GetAllocator() { 779 SkBitmap::Allocator* SkScaledImageCache::GetAllocator() {
752 SkAutoMutexAcquire am(gMutex); 780 SkAutoMutexAcquire am(gMutex);
753 return get_cache()->allocator(); 781 return get_cache()->allocator();
754 } 782 }
755 783
784 void SkScaledImageCache::Dump() {
785 SkAutoMutexAcquire am(gMutex);
786 get_cache()->dump();
787 }
788
756 /////////////////////////////////////////////////////////////////////////////// 789 ///////////////////////////////////////////////////////////////////////////////
757 790
758 #include "SkGraphics.h" 791 #include "SkGraphics.h"
759 792
760 size_t SkGraphics::GetImageCacheBytesUsed() { 793 size_t SkGraphics::GetImageCacheBytesUsed() {
761 return SkScaledImageCache::GetBytesUsed(); 794 return SkScaledImageCache::GetBytesUsed();
762 } 795 }
763 796
764 size_t SkGraphics::GetImageCacheByteLimit() { 797 size_t SkGraphics::GetImageCacheByteLimit() {
765 return SkScaledImageCache::GetByteLimit(); 798 return SkScaledImageCache::GetByteLimit();
766 } 799 }
767 800
768 size_t SkGraphics::SetImageCacheByteLimit(size_t newLimit) { 801 size_t SkGraphics::SetImageCacheByteLimit(size_t newLimit) {
769 return SkScaledImageCache::SetByteLimit(newLimit); 802 return SkScaledImageCache::SetByteLimit(newLimit);
770 } 803 }
OLDNEW
« no previous file with comments | « src/core/SkScaledImageCache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698