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
This commit is contained in:
parent
992854d62e
commit
941da9d661
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user