static void bounce_ref(void* data) { SkRefCnt* ref = static_cast<SkRefCnt*>(data); for (int i = 0; i < 100000; ++i) { ref->ref(); ref->unref(); } }
virtual void onDraw(const int loops, SkCanvas*) { for (int i = 0; i < loops; ++i) { SkRefCnt ref; for (int j = 0; j < M; ++j) { ref.ref(); ref.unref(); } } }
virtual void onDraw(const int loops, SkCanvas*) { for (int i = 0; i < loops; ++i) { SkRefCnt* ref = new SkRefCnt(); for (int j = 0; j < M; ++j) { ref->ref(); ref->unref(); } ref->unref(); } }
void* SkMetaData::RefCntProc(void* ptr, bool doRef) { SkASSERT(ptr); SkRefCnt* refcnt = reinterpret_cast<SkRefCnt*>(ptr); if (doRef) { refcnt->ref(); } else { refcnt->unref(); } return ptr; }
DEF_TEST(sk_sp_ref, r) { SkRefCnt* rc = new SkRefCnt; REPORTER_ASSERT(r, rc->unique()); { sk_sp<SkRefCnt> sp = sk_ref_sp(rc); REPORTER_ASSERT(r, !rc->unique()); } REPORTER_ASSERT(r, rc->unique()); rc->unref(); }
static void test_refCnt(skiatest::Reporter* reporter) { SkRefCnt* ref = new SkRefCnt(); std::thread thing1(bounce_ref, ref); std::thread thing2(bounce_ref, ref); thing1.join(); thing2.join(); REPORTER_ASSERT(reporter, ref->unique()); ref->unref(); }
static void test_ptrs(skiatest::Reporter* reporter) { SkRefCnt ref; REPORTER_ASSERT(reporter, ref.unique()); { SkMetaData md0, md1; const char name[] = "refcnt"; md0.setRefCnt(name, &ref); REPORTER_ASSERT(reporter, md0.findRefCnt(name)); REPORTER_ASSERT(reporter, md0.hasRefCnt(name, &ref)); REPORTER_ASSERT(reporter, !ref.unique()); md1 = md0; REPORTER_ASSERT(reporter, md1.findRefCnt(name)); REPORTER_ASSERT(reporter, md1.hasRefCnt(name, &ref)); REPORTER_ASSERT(reporter, !ref.unique()); REPORTER_ASSERT(reporter, md0.removeRefCnt(name)); REPORTER_ASSERT(reporter, !md0.findRefCnt(name)); REPORTER_ASSERT(reporter, !md0.hasRefCnt(name, &ref)); REPORTER_ASSERT(reporter, !ref.unique()); } REPORTER_ASSERT(reporter, ref.unique()); }
// 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()); }