blob: cf4acc62332fec41e5a5e7658e85d5274baeeab9 [file] [log] [blame]
bungeman@google.com55487522012-05-14 14:09:24 +00001/*
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
bungeman@google.com55487522012-05-14 14:09:24 +00008#include "SkRefCnt.h"
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +00009#include "SkThreadUtils.h"
10#include "SkTypes.h"
11#include "SkWeakRefCnt.h"
tfarina@chromium.org8f6884a2014-01-24 20:56:26 +000012#include "Test.h"
bungeman@google.com55487522012-05-14 14:09:24 +000013
reed@google.com80ba7962012-07-21 17:31:40 +000014class InstCounterClass {
15public:
reed@google.comf7943032012-07-23 14:50:38 +000016 InstCounterClass() { fCount = gInstCounter++; }
17 InstCounterClass(const InstCounterClass& src) {
18 fCount = src.fCount;
19 gInstCounter += 1;
20 }
21 virtual ~InstCounterClass() { gInstCounter -= 1; }
reed@google.com80ba7962012-07-21 17:31:40 +000022
23 static int gInstCounter;
reed@google.comf7943032012-07-23 14:50:38 +000024 int fCount;
reed@google.com80ba7962012-07-21 17:31:40 +000025};
26
27int InstCounterClass::gInstCounter;
28
bungeman@google.com55487522012-05-14 14:09:24 +000029static void bounce_ref(void* data) {
30 SkRefCnt* ref = static_cast<SkRefCnt*>(data);
31 for (int i = 0; i < 100000; ++i) {
32 ref->ref();
33 ref->unref();
34 }
35}
36
37static void test_refCnt(skiatest::Reporter* reporter) {
38 SkRefCnt* ref = new SkRefCnt();
39
40 SkThread thing1(bounce_ref, ref);
41 SkThread thing2(bounce_ref, ref);
42
43 thing1.setProcessorAffinity(0);
44 thing2.setProcessorAffinity(23);
45
46 SkASSERT(thing1.start());
47 SkASSERT(thing2.start());
48
49 thing1.join();
50 thing2.join();
51
mtkleinbbb61d72014-11-24 13:09:39 -080052 REPORTER_ASSERT(reporter, ref->unique());
bungeman@google.com55487522012-05-14 14:09:24 +000053 ref->unref();
54}
55
bungeman@google.coma02bc152012-05-16 18:21:56 +000056static void bounce_weak_ref(void* data) {
57 SkWeakRefCnt* ref = static_cast<SkWeakRefCnt*>(data);
58 for (int i = 0; i < 100000; ++i) {
59 if (ref->try_ref()) {
60 ref->unref();
61 }
62 }
63}
64
65static void bounce_weak_weak_ref(void* data) {
66 SkWeakRefCnt* ref = static_cast<SkWeakRefCnt*>(data);
67 for (int i = 0; i < 100000; ++i) {
68 ref->weak_ref();
69 ref->weak_unref();
70 }
71}
72
73static void test_weakRefCnt(skiatest::Reporter* reporter) {
74 SkWeakRefCnt* ref = new SkWeakRefCnt();
75
76 SkThread thing1(bounce_ref, ref);
77 SkThread thing2(bounce_ref, ref);
78 SkThread thing3(bounce_weak_ref, ref);
79 SkThread thing4(bounce_weak_weak_ref, ref);
80
81 thing1.setProcessorAffinity(0);
82 thing2.setProcessorAffinity(23);
83 thing3.setProcessorAffinity(2);
84 thing4.setProcessorAffinity(17);
85
86 SkASSERT(thing1.start());
87 SkASSERT(thing2.start());
88 SkASSERT(thing3.start());
89 SkASSERT(thing4.start());
90
91 thing1.join();
92 thing2.join();
93 thing3.join();
94 thing4.join();
95
mtkleinbbb61d72014-11-24 13:09:39 -080096 REPORTER_ASSERT(reporter, ref->unique());
Mike Klein874a62a2014-07-09 09:04:07 -040097 REPORTER_ASSERT(reporter, ref->getWeakCnt() == 1);
bungeman@google.coma02bc152012-05-16 18:21:56 +000098 ref->unref();
99}
100
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +0000101DEF_TEST(RefCnt, reporter) {
bungeman@google.coma02bc152012-05-16 18:21:56 +0000102 test_refCnt(reporter);
103 test_weakRefCnt(reporter);
104}