diff options
-rw-r--r-- | include/core/SkRefCnt.h | 6 | ||||
-rw-r--r-- | tests/RefCntTest.cpp | 18 |
2 files changed, 20 insertions, 4 deletions
diff --git a/include/core/SkRefCnt.h b/include/core/SkRefCnt.h index 9b05ad4969..d33117751e 100644 --- a/include/core/SkRefCnt.h +++ b/include/core/SkRefCnt.h @@ -338,10 +338,8 @@ public: * No call to ref() will be made. */ void reset(T* ptr = nullptr) { - if (fPtr != ptr) { - SkSafeUnref(fPtr); - fPtr = ptr; - } + SkSafeUnref(fPtr); + fPtr = ptr; } /** diff --git a/tests/RefCntTest.cpp b/tests/RefCntTest.cpp index 8914ccff49..f5345b6a54 100644 --- a/tests/RefCntTest.cpp +++ b/tests/RefCntTest.cpp @@ -290,3 +290,21 @@ static sk_sp<FooAbstract> make_foo() { DEF_TEST(sk_make_sp, r) { auto x = make_foo(); } + +// Test that reset() "adopts" ownership from the caller, even if we are given the same ptr twice +// +DEF_TEST(sk_sp_reset, r) { + SkRefCnt* rc = new SkRefCnt; + REPORTER_ASSERT(r, rc->unique()); + + sk_sp<SkRefCnt> sp; + sp.reset(rc); + // We have transfered our ownership over to sp + REPORTER_ASSERT(r, rc->unique()); + + rc->ref(); // now "rc" is also an owner + REPORTER_ASSERT(r, !rc->unique()); + + sp.reset(rc); // this should transfer our ownership over to sp + REPORTER_ASSERT(r, rc->unique()); +} |