1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkRefCnt.h" 9 #include "SkThreadUtils.h" 10 #include "SkTypes.h" 11 #include "SkWeakRefCnt.h" 12 #include "Test.h" 13 14 static void bounce_ref(void* data) { 15 SkRefCnt* ref = static_cast<SkRefCnt*>(data); 16 for (int i = 0; i < 100000; ++i) { 17 ref->ref(); 18 ref->unref(); 19 } 20 } 21 22 static void test_refCnt(skiatest::Reporter* reporter) { 23 SkRefCnt* ref = new SkRefCnt(); 24 25 SkThread thing1(bounce_ref, ref); 26 SkThread thing2(bounce_ref, ref); 27 28 SkASSERT(thing1.start()); 29 SkASSERT(thing2.start()); 30 31 thing1.join(); 32 thing2.join(); 33 34 REPORTER_ASSERT(reporter, ref->unique()); 35 ref->unref(); 36 } 37 38 static void bounce_weak_ref(void* data) { 39 SkWeakRefCnt* ref = static_cast<SkWeakRefCnt*>(data); 40 for (int i = 0; i < 100000; ++i) { 41 if (ref->try_ref()) { 42 ref->unref(); 43 } 44 } 45 } 46 47 static void bounce_weak_weak_ref(void* data) { 48 SkWeakRefCnt* ref = static_cast<SkWeakRefCnt*>(data); 49 for (int i = 0; i < 100000; ++i) { 50 ref->weak_ref(); 51 ref->weak_unref(); 52 } 53 } 54 55 static void test_weakRefCnt(skiatest::Reporter* reporter) { 56 SkWeakRefCnt* ref = new SkWeakRefCnt(); 57 58 SkThread thing1(bounce_ref, ref); 59 SkThread thing2(bounce_ref, ref); 60 SkThread thing3(bounce_weak_ref, ref); 61 SkThread thing4(bounce_weak_weak_ref, ref); 62 63 SkASSERT(thing1.start()); 64 SkASSERT(thing2.start()); 65 SkASSERT(thing3.start()); 66 SkASSERT(thing4.start()); 67 68 thing1.join(); 69 thing2.join(); 70 thing3.join(); 71 thing4.join(); 72 73 REPORTER_ASSERT(reporter, ref->unique()); 74 REPORTER_ASSERT(reporter, ref->getWeakCnt() == 1); 75 ref->unref(); 76 } 77 78 DEF_TEST(RefCnt, reporter) { 79 test_refCnt(reporter); 80 test_weakRefCnt(reporter); 81 } 82