aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/RefCntTest.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-03-06 13:54:00 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-06 13:54:00 -0800
commit941da9d66171bd8efd2f6c5e25ff90c8c69885c1 (patch)
treea8ab867b53ab24493a2010cdd71224afaceeb791 /tests/RefCntTest.cpp
parent992854d62e179a589aa7366e443246e3672c3248 (diff)
Fix behavior of sk_sp::reset(T*) and add unittest.
Previously, sk_sp::reset(T* t) did not release its own reference if its internal pointer was the same as 't'. This leaks a reference. Now always release the current reference when non-nullptr. Review URL: https://codereview.chromium.org/1767983002
Diffstat (limited to 'tests/RefCntTest.cpp')
-rw-r--r--tests/RefCntTest.cpp18
1 files changed, 18 insertions, 0 deletions
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());
+}