Index: include/core/SkRefCnt.h |
diff --git a/include/core/SkRefCnt.h b/include/core/SkRefCnt.h |
index 1e31d918cc973727fcdf6b99b5d27a823bba478c..ab716ddf58d83fa3e4f23195f15b818b6e93fa1e 100644 |
--- a/include/core/SkRefCnt.h |
+++ b/include/core/SkRefCnt.h |
@@ -253,6 +253,11 @@ template <typename Derived> |
class SkNVRefCnt : SkNoncopyable { |
public: |
SkNVRefCnt() : fRefCnt(1) {} |
+#ifdef SK_DEBUG |
mtklein
2014/11/22 00:08:14
Double debug guards seem like overkill? Should be
|
+ ~SkNVRefCnt() { |
+ SkASSERTF(1 == fRefCnt, "NVRefCnt was %d", fRefCnt); |
+ } |
+#endif |
// Implementation is pretty much the same as SkRefCntBase. All required barriers are the same: |
// - unique() needs acquire when it returns true, and no barrier if it returns false; |
@@ -261,7 +266,14 @@ public: |
bool unique() const { return 1 == sk_acquire_load(&fRefCnt); } |
void ref() const { sk_atomic_inc(&fRefCnt); } |
- void unref() const { if (1 == sk_atomic_dec(&fRefCnt)) { SkDELETE((const Derived*)this); } } |
+ void unref() const { |
+ int32_t prevValue = sk_atomic_dec(&fRefCnt); |
+ SkASSERT(prevValue >= 1); |
+ if (1 == prevValue) { |
+ SkDEBUGCODE(fRefCnt = 1;) // for the assert in our destructor |
bsalomon
2014/11/21 22:48:50
Why 1? For stack objects? Do we want to allow that
mtklein
2014/11/22 00:08:14
I'm game to try disallowing the stack and delete i
|
+ SkDELETE((const Derived*)this); |
+ } |
+ } |
void deref() const { this->unref(); } // Chrome prefers to call deref(). |
int32_t getRefCnt() const { return fRefCnt; } // Used by Chrome unit tests. |