Fix SkImageFilterCache race
authorFlorin Malita <fmalita@chromium.org>
Thu, 12 Jan 2017 17:06:14 +0000 (12:06 -0500)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Thu, 12 Jan 2017 17:56:13 +0000 (17:56 +0000)
BUG=chromium:668937
R=reed@google.com,robertphillips@google.com

Change-Id: I72ceaf1d88946c277a38f32014640e01ae9cbded
Reviewed-on: https://skia-review.googlesource.com/6954
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>

src/core/SkImageFilter.cpp
src/core/SkImageFilterCache.cpp
src/core/SkImageFilterCache.h
tests/ImageFilterCacheTest.cpp

index 8ce5e8e..40a7a22 100644 (file)
@@ -207,9 +207,9 @@ sk_sp<SkSpecialImage> SkImageFilter::filterImage(SkSpecialImage* src, const Cont
     const SkIRect srcSubset = fUsesSrcInput ? src->subset() : SkIRect::MakeWH(0, 0);
     SkImageFilterCacheKey key(fUniqueID, context.ctm(), context.clipBounds(), srcGenID, srcSubset);
     if (context.cache()) {
-        SkSpecialImage* result = context.cache()->get(key, offset);
+        sk_sp<SkSpecialImage> result = context.cache()->get(key, offset);
         if (result) {
-            return sk_sp<SkSpecialImage>(SkRef(result));
+            return result;
         }
     }
 
index 889e81f..0d9e367 100644 (file)
@@ -52,7 +52,7 @@ public:
         SK_DECLARE_INTERNAL_LLIST_INTERFACE(Value);
     };
 
-    SkSpecialImage* get(const Key& key, SkIPoint* offset) const override {
+    sk_sp<SkSpecialImage> get(const Key& key, SkIPoint* offset) const override {
         SkAutoMutexAcquire mutex(fMutex);
         if (Value* v = fLookup.find(key)) {
             *offset = v->fOffset;
@@ -60,7 +60,7 @@ public:
                 fLRU.remove(v);
                 fLRU.addToHead(v);
             }
-            return v->fImage.get();
+            return v->fImage;
         }
         return nullptr;
     }
index a65357f..8f0d9f1 100644 (file)
@@ -53,7 +53,7 @@ public:
     virtual ~SkImageFilterCache() {}
     static SkImageFilterCache* Create(size_t maxBytes);
     static SkImageFilterCache* Get();
-    virtual SkSpecialImage* get(const SkImageFilterCacheKey& key, SkIPoint* offset) const = 0;
+    virtual sk_sp<SkSpecialImage> get(const SkImageFilterCacheKey& key, SkIPoint* offset) const = 0;
     virtual void set(const SkImageFilterCacheKey& key, SkSpecialImage* image,
                      const SkIPoint& offset) = 0;
     virtual void purge() = 0;
index e0aceda..650d4cb 100644 (file)
@@ -41,7 +41,7 @@ static void test_find_existing(skiatest::Reporter* reporter,
 
     SkIPoint foundOffset;
 
-    SkSpecialImage* foundImage = cache->get(key1, &foundOffset);
+    sk_sp<SkSpecialImage> foundImage = cache->get(key1, &foundOffset);
     REPORTER_ASSERT(reporter, foundImage);
     REPORTER_ASSERT(reporter, offset == foundOffset);