aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkRefCnt.h6
-rw-r--r--tests/RefCntTest.cpp18
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());
+}