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

Unified Diff: src/lazy/SkLruImageCache.cpp

Issue 103033002: Big Cleanup: SkBitmapFactory, SkLazyPixelRef, SkImageCache (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase one last time 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/lazy/SkLazyPixelRef.cpp ('k') | src/lazy/SkPurgeableImageCache.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/lazy/SkLruImageCache.cpp
diff --git a/src/lazy/SkLruImageCache.cpp b/src/lazy/SkLruImageCache.cpp
deleted file mode 100644
index 26f7ef54838bd8c61fd47178fe7a30eba895e371..0000000000000000000000000000000000000000
--- a/src/lazy/SkLruImageCache.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkLruImageCache.h"
-
-static intptr_t NextGenerationID() {
- static intptr_t gNextID;
- do {
- gNextID++;
- } while (SkImageCache::UNINITIALIZED_ID == gNextID);
- return gNextID;
-}
-
-class CachedPixels : public SkNoncopyable {
-
-public:
- CachedPixels(size_t length)
- : fLength(length)
- , fID(NextGenerationID())
- , fLocked(false) {
- fAddr = sk_malloc_throw(length);
- }
-
- ~CachedPixels() {
- sk_free(fAddr);
- }
-
- void* getData() { return fAddr; }
-
- intptr_t getID() const { return fID; }
-
- size_t getLength() const { return fLength; }
-
- void lock() { SkASSERT(!fLocked); fLocked = true; }
-
- void unlock() { SkASSERT(fLocked); fLocked = false; }
-
- bool isLocked() const { return fLocked; }
-
-private:
- void* fAddr;
- size_t fLength;
- const intptr_t fID;
- bool fLocked;
- SK_DECLARE_INTERNAL_LLIST_INTERFACE(CachedPixels);
-};
-
-////////////////////////////////////////////////////////////////////////////////////
-
-SkLruImageCache::SkLruImageCache(size_t budget)
- : fRamBudget(budget)
- , fRamUsed(0) {}
-
-SkLruImageCache::~SkLruImageCache() {
- // Don't worry about updating pointers. All will be deleted.
- Iter iter;
- CachedPixels* pixels = iter.init(fLRU, Iter::kTail_IterStart);
- while (pixels != NULL) {
- CachedPixels* prev = iter.prev();
- SkASSERT(!pixels->isLocked());
-#ifdef SK_DEBUG
- fRamUsed -= pixels->getLength();
-#endif
- SkDELETE(pixels);
- pixels = prev;
- }
-#ifdef SK_DEBUG
- SkASSERT(fRamUsed == 0);
-#endif
-}
-
-#ifdef SK_DEBUG
-SkImageCache::MemoryStatus SkLruImageCache::getMemoryStatus(intptr_t ID) const {
- if (SkImageCache::UNINITIALIZED_ID == ID) {
- return SkImageCache::kFreed_MemoryStatus;
- }
- SkAutoMutexAcquire ac(&fMutex);
- CachedPixels* pixels = this->findByID(ID);
- if (NULL == pixels) {
- return SkImageCache::kFreed_MemoryStatus;
- }
- if (pixels->isLocked()) {
- return SkImageCache::kPinned_MemoryStatus;
- }
- return SkImageCache::kUnpinned_MemoryStatus;
-}
-
-void SkLruImageCache::purgeAllUnpinnedCaches() {
- SkAutoMutexAcquire ac(&fMutex);
- this->purgeTilAtOrBelow(0);
-}
-#endif
-
-size_t SkLruImageCache::setImageCacheLimit(size_t newLimit) {
- size_t oldLimit = fRamBudget;
- SkAutoMutexAcquire ac(&fMutex);
- fRamBudget = newLimit;
- this->purgeIfNeeded();
- return oldLimit;
-}
-
-void* SkLruImageCache::allocAndPinCache(size_t bytes, intptr_t* ID) {
- SkAutoMutexAcquire ac(&fMutex);
- CachedPixels* pixels = SkNEW_ARGS(CachedPixels, (bytes));
- if (ID != NULL) {
- *ID = pixels->getID();
- }
- pixels->lock();
- fRamUsed += bytes;
- fLRU.addToHead(pixels);
- this->purgeIfNeeded();
- return pixels->getData();
-}
-
-void* SkLruImageCache::pinCache(intptr_t ID, SkImageCache::DataStatus* status) {
- SkASSERT(ID != SkImageCache::UNINITIALIZED_ID);
- SkAutoMutexAcquire ac(&fMutex);
- CachedPixels* pixels = this->findByID(ID);
- if (NULL == pixels) {
- return NULL;
- }
- if (pixels != fLRU.head()) {
- fLRU.remove(pixels);
- fLRU.addToHead(pixels);
- }
- SkASSERT(status != NULL);
- // This cache will never return pinned memory whose data has been overwritten.
- *status = SkImageCache::kRetained_DataStatus;
- pixels->lock();
- return pixels->getData();
-}
-
-void SkLruImageCache::releaseCache(intptr_t ID) {
- SkASSERT(ID != SkImageCache::UNINITIALIZED_ID);
- SkAutoMutexAcquire ac(&fMutex);
- CachedPixels* pixels = this->findByID(ID);
- SkASSERT(pixels != NULL);
- pixels->unlock();
- this->purgeIfNeeded();
-}
-
-void SkLruImageCache::throwAwayCache(intptr_t ID) {
- SkASSERT(ID != SkImageCache::UNINITIALIZED_ID);
- SkAutoMutexAcquire ac(&fMutex);
- CachedPixels* pixels = this->findByID(ID);
- if (pixels != NULL) {
- if (pixels->isLocked()) {
- pixels->unlock();
- }
- this->removePixels(pixels);
- }
-}
-
-void SkLruImageCache::removePixels(CachedPixels* pixels) {
- // Mutex is already locked.
- SkASSERT(!pixels->isLocked());
- const size_t size = pixels->getLength();
- SkASSERT(size <= fRamUsed);
- fLRU.remove(pixels);
- SkDELETE(pixels);
- fRamUsed -= size;
-}
-
-CachedPixels* SkLruImageCache::findByID(intptr_t ID) const {
- // Mutex is already locked.
- Iter iter;
- // Start from the head, most recently used.
- CachedPixels* pixels = iter.init(fLRU, Iter::kHead_IterStart);
- while (pixels != NULL) {
- if (pixels->getID() == ID) {
- return pixels;
- }
- pixels = iter.next();
- }
- return NULL;
-}
-
-void SkLruImageCache::purgeIfNeeded() {
- // Mutex is already locked.
- if (fRamBudget > 0) {
- this->purgeTilAtOrBelow(fRamBudget);
- }
-}
-
-void SkLruImageCache::purgeTilAtOrBelow(size_t limit) {
- // Mutex is already locked.
- if (fRamUsed > limit) {
- Iter iter;
- // Start from the tail, least recently used.
- CachedPixels* pixels = iter.init(fLRU, Iter::kTail_IterStart);
- while (pixels != NULL && fRamUsed > limit) {
- CachedPixels* prev = iter.prev();
- if (!pixels->isLocked()) {
- this->removePixels(pixels);
- }
- pixels = prev;
- }
- }
-}
« no previous file with comments | « src/lazy/SkLazyPixelRef.cpp ('k') | src/lazy/SkPurgeableImageCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698