add more tests for discardable caches

BUG=
R=halcanary@google.com

Review URL: https://codereview.chromium.org/112833003

git-svn-id: http://skia.googlecode.com/svn/trunk@12618 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkScaledImageCache.cpp b/src/core/SkScaledImageCache.cpp
index 5b16688..b3956f4 100644
--- a/src/core/SkScaledImageCache.cpp
+++ b/src/core/SkScaledImageCache.cpp
@@ -209,6 +209,7 @@
     SkDiscardableMemory* fDM;
     size_t               fRB;
     bool                 fFirstTime;
+    bool                 fIsLocked;
 
     typedef SkPixelRef INHERITED;
 };
@@ -224,6 +225,7 @@
 
     SkASSERT(dm->data());
     fFirstTime = true;
+    fIsLocked = false;
 }
 
 SkOneShotDiscardablePixelRef::~SkOneShotDiscardablePixelRef() {
@@ -236,12 +238,18 @@
         fFirstTime = false;
         return fDM->data();
     }
-    return fDM->lock() ? fDM->data() : NULL;
+
+    SkASSERT(!fIsLocked);
+    fIsLocked = fDM->lock();
+    return fIsLocked ? fDM->data() : NULL;
 }
 
 void SkOneShotDiscardablePixelRef::onUnlockPixels() {
     SkASSERT(!fFirstTime);
-    fDM->unlock();
+    if (fIsLocked) {
+        fIsLocked = false;
+        fDM->unlock();
+    }
 }
 
 size_t SkOneShotDiscardablePixelRef::getAllocatedSizeInBytes() const {
diff --git a/src/lazy/SkDiscardableMemoryPool.h b/src/lazy/SkDiscardableMemoryPool.h
index e9f3b04..61bad70 100644
--- a/src/lazy/SkDiscardableMemoryPool.h
+++ b/src/lazy/SkDiscardableMemoryPool.h
@@ -12,6 +12,8 @@
 #include "SkTInternalLList.h"
 #include "SkThread.h"
 
+class SkPoolDiscardableMemory;
+
 #ifdef SK_DEBUG
     #define LAZY_CACHE_STATS 1
 #elif !defined(LAZY_CACHE_STATS)
@@ -22,20 +24,22 @@
  *  This non-global pool can be used for unit tests to verify that the
  *  pool works.
  */
-class SkPoolDiscardableMemory;
 class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory {
 public:
     /**
      *  Without mutex, will be not be thread safe.
      */
     SkDiscardableMemoryPool(size_t budget, SkBaseMutex* mutex = NULL);
-    ~SkDiscardableMemoryPool();
-    SkDiscardableMemory* create(size_t bytes) SK_OVERRIDE;
+    virtual ~SkDiscardableMemoryPool();
+
+    virtual SkDiscardableMemory* create(size_t bytes) SK_OVERRIDE;
+
     size_t getRAMUsed();
     void setRAMBudget(size_t budget);
+
     /** purges all unlocked DMs */
     void dumpPool();
-    friend class SkPoolDiscardableMemory;
+
     #if LAZY_CACHE_STATS
     int          fCacheHits;
     int          fCacheMisses;
@@ -46,6 +50,7 @@
     size_t       fBudget;
     size_t       fUsed;
     SkTInternalLList<SkPoolDiscardableMemory> fList;
+
     /** Function called to free memory if needed */
     void dumpDownTo(size_t budget);
     /** called by SkDiscardableMemoryPool upon destruction */
@@ -54,6 +59,9 @@
     bool lock(SkPoolDiscardableMemory* dm);
     /** called by SkDiscardableMemoryPool::unlock() */
     void unlock(SkPoolDiscardableMemory* dm);
+
+    friend class SkPoolDiscardableMemory;
+
     typedef SkDiscardableMemory::Factory INHERITED;
 };