From 941da9d66171bd8efd2f6c5e25ff90c8c69885c1 Mon Sep 17 00:00:00 2001 From: reed Date: Sun, 6 Mar 2016 13:54:00 -0800 Subject: 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 --- tests/RefCntTest.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'tests/RefCntTest.cpp') 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 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 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()); +} -- cgit v1.2.3