Index: src/core/SkCachedData.cpp |
diff --git a/src/core/SkCachedData.cpp b/src/core/SkCachedData.cpp |
deleted file mode 100644 |
index 93d119820ee203eab440bc359c9fcd8ef0ed473e..0000000000000000000000000000000000000000 |
--- a/src/core/SkCachedData.cpp |
+++ /dev/null |
@@ -1,175 +0,0 @@ |
-/* |
- * Copyright 2014 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "SkCachedData.h" |
-#include "SkRefCnt.h" |
-#include "SkDiscardableMemory.h" |
- |
-SkCachedData::SkCachedData(void* data, size_t size) |
- : fData(data) |
- , fSize(size) |
- , fRefCnt(1) |
- , fStorageType(kMalloc_StorageType) |
- , fInCache(false) |
- , fIsLocked(true) |
-{ |
- fStorage.fMalloc = data; |
-} |
- |
-SkCachedData::SkCachedData(size_t size, SkDiscardableMemory* dm) |
- : fData(dm->data()) |
- , fSize(size) |
- , fRefCnt(1) |
- , fStorageType(kDiscardableMemory_StorageType) |
- , fInCache(false) |
- , fIsLocked(true) |
-{ |
- fStorage.fDM = dm; |
-} |
- |
-SkCachedData::~SkCachedData() { |
- switch (fStorageType) { |
- case kMalloc_StorageType: |
- sk_free(fStorage.fMalloc); |
- break; |
- case kDiscardableMemory_StorageType: |
- SkDELETE(fStorage.fDM); |
- break; |
- } |
-} |
- |
-class SkCachedData::AutoMutexWritable { |
-public: |
- AutoMutexWritable(const SkCachedData* cd) : fCD(const_cast<SkCachedData*>(cd)) { |
- fCD->fMutex.acquire(); |
- fCD->validate(); |
- } |
- ~AutoMutexWritable() { |
- fCD->validate(); |
- fCD->fMutex.release(); |
- } |
- |
- SkCachedData* get() { return fCD; } |
- SkCachedData* operator->() { return fCD; } |
- |
-private: |
- SkCachedData* fCD; |
-}; |
- |
-void SkCachedData::internalRef(bool fromCache) const { |
- AutoMutexWritable(this)->inMutexRef(fromCache); |
-} |
- |
-void SkCachedData::internalUnref(bool fromCache) const { |
- if (AutoMutexWritable(this)->inMutexUnref(fromCache)) { |
- // can't delete inside doInternalUnref, since it is locking a mutex (which we own) |
- SkDELETE(this); |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////////////////////////// |
- |
-void SkCachedData::inMutexRef(bool fromCache) { |
- if ((1 == fRefCnt) && fInCache) { |
- this->inMutexLock(); |
- } |
- |
- fRefCnt += 1; |
- if (fromCache) { |
- SkASSERT(!fInCache); |
- fInCache = true; |
- } |
-} |
- |
-bool SkCachedData::inMutexUnref(bool fromCache) { |
- switch (--fRefCnt) { |
- case 0: |
- // we're going to be deleted, so we need to be unlocked (for DiscardableMemory) |
- if (fIsLocked) { |
- this->inMutexUnlock(); |
- } |
- break; |
- case 1: |
- if (fInCache && !fromCache) { |
- // If we're down to 1 owner, and that owner is the cache, this it is safe |
- // to unlock (and mutate fData) even if the cache is in a different thread, |
- // as the cache is NOT allowed to inspect or use fData. |
- this->inMutexUnlock(); |
- } |
- break; |
- default: |
- break; |
- } |
- |
- if (fromCache) { |
- SkASSERT(fInCache); |
- fInCache = false; |
- } |
- |
- // return true when we need to be deleted |
- return 0 == fRefCnt; |
-} |
- |
-void SkCachedData::inMutexLock() { |
- fMutex.assertHeld(); |
- |
- SkASSERT(!fIsLocked); |
- fIsLocked = true; |
- |
- switch (fStorageType) { |
- case kMalloc_StorageType: |
- this->setData(fStorage.fMalloc); |
- break; |
- case kDiscardableMemory_StorageType: |
- if (fStorage.fDM->lock()) { |
- this->setData(fStorage.fDM->data()); |
- } else { |
- this->setData(NULL); // signal failure to lock, contents are gone |
- } |
- break; |
- } |
-} |
- |
-void SkCachedData::inMutexUnlock() { |
- fMutex.assertHeld(); |
- |
- SkASSERT(fIsLocked); |
- fIsLocked = false; |
- |
- switch (fStorageType) { |
- case kMalloc_StorageType: |
- // nothing to do/check |
- break; |
- case kDiscardableMemory_StorageType: |
- if (fData) { // did the previous lock succeed? |
- fStorage.fDM->unlock(); |
- } |
- break; |
- } |
- this->setData(NULL); // signal that we're in an unlocked state |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////////////////////////// |
- |
-#ifdef SK_DEBUG |
-void SkCachedData::validate() const { |
- if (fIsLocked) { |
- SkASSERT((fInCache && fRefCnt > 1) || !fInCache); |
- switch (fStorageType) { |
- case kMalloc_StorageType: |
- SkASSERT(fData == fStorage.fMalloc); |
- break; |
- case kDiscardableMemory_StorageType: |
- // fData can be null or the actual value, depending if DM's lock succeeded |
- break; |
- } |
- } else { |
- SkASSERT((fInCache && 1 == fRefCnt) || (0 == fRefCnt)); |
- SkASSERT(NULL == fData); |
- } |
-} |
-#endif |