blob: 7da3339c380d67b211ad5ed4decaff0f9824bd4d [file] [log] [blame]
Herb Derbyac04fef2017-01-13 17:34:33 -05001/*
2 * Copyright 2016 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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkRefCnt.h"
9#include "include/core/SkTypes.h"
Ben Wagner729a23f2019-05-17 16:29:34 -040010#include "src/core/SkArenaAlloc.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "tests/Test.h"
Ben Wagner1ebeefe2018-03-02 16:59:53 -050012
13#include <memory>
14#include <new>
15#include <type_traits>
Herb Derbyac04fef2017-01-13 17:34:33 -050016
17namespace {
18
19 static int created, destroyed;
20
21 struct Foo {
22 Foo() : x(-2), y(-3.0f) { created++; }
23 Foo(int X, float Y) : x(X), y(Y) { created++; }
24 ~Foo() { destroyed++; }
25
26 int x;
27 float y;
28 };
29
30 struct Big {
31 Big() {}
32 uint32_t array[128];
33 };
34
Herb Derby593cb942017-01-19 14:28:49 -050035 struct Node {
36 Node(Node* n) : next(n) { created++; }
37 ~Node() {
38 destroyed++;
39 if (next) {
40 next->~Node();
41 }
42 }
43 Node *next;
44 };
45
46 struct Start {
47 ~Start() {
48 if (start) {
49 start->~Node();
50 }
51 }
52 Node* start;
53 };
54
Herb Derby68521702017-02-06 13:03:49 -050055 struct FooRefCnt : public SkRefCnt {
56 FooRefCnt() : x(-2), y(-3.0f) { created++; }
57 FooRefCnt(int X, float Y) : x(X), y(Y) { created++; }
Brian Salomond0072812020-07-21 17:03:56 -040058 ~FooRefCnt() override { destroyed++; }
Herb Derby68521702017-02-06 13:03:49 -050059
60 int x;
61 float y;
62 };
63
John Stilesa6841be2020-08-06 14:11:56 -040064} // namespace
Herb Derbyac04fef2017-01-13 17:34:33 -050065
66struct WithDtor {
67 ~WithDtor() { }
68};
69
Mike Kleinfb5850f2020-11-09 15:50:37 -060070struct alignas(8) OddAlignment {
71 char buf[10];
72};
73
Herb Derbyac04fef2017-01-13 17:34:33 -050074DEF_TEST(ArenaAlloc, r) {
75
76 {
77 created = 0;
78 destroyed = 0;
79
Herb Derbydcbe2c82017-04-14 14:51:27 -040080 SkArenaAlloc arena{0};
Herb Derbyac04fef2017-01-13 17:34:33 -050081 REPORTER_ASSERT(r, *arena.make<int>(3) == 3);
82 Foo* foo = arena.make<Foo>(3, 4.0f);
83 REPORTER_ASSERT(r, foo->x == 3);
84 REPORTER_ASSERT(r, foo->y == 4.0f);
85 REPORTER_ASSERT(r, created == 1);
86 REPORTER_ASSERT(r, destroyed == 0);
87 arena.makeArrayDefault<int>(10);
88 int* zeroed = arena.makeArray<int>(10);
89 for (int i = 0; i < 10; i++) {
90 REPORTER_ASSERT(r, zeroed[i] == 0);
91 }
92 Foo* fooArray = arena.makeArrayDefault<Foo>(10);
93 REPORTER_ASSERT(r, fooArray[3].x == -2);
94 REPORTER_ASSERT(r, fooArray[4].y == -3.0f);
95 REPORTER_ASSERT(r, created == 11);
96 REPORTER_ASSERT(r, destroyed == 0);
Mike Kleinfb5850f2020-11-09 15:50:37 -060097 arena.make<OddAlignment>();
Herb Derbyac04fef2017-01-13 17:34:33 -050098 }
99 REPORTER_ASSERT(r, created == 11);
100 REPORTER_ASSERT(r, destroyed == 11);
101
102 {
103 created = 0;
104 destroyed = 0;
Florin Malita14a64302017-05-24 14:53:44 -0400105 SkSTArenaAlloc<64> arena;
Herb Derbyac04fef2017-01-13 17:34:33 -0500106
107 REPORTER_ASSERT(r, *arena.make<int>(3) == 3);
108 Foo* foo = arena.make<Foo>(3, 4.0f);
109 REPORTER_ASSERT(r, foo->x == 3);
110 REPORTER_ASSERT(r, foo->y == 4.0f);
111 REPORTER_ASSERT(r, created == 1);
112 REPORTER_ASSERT(r, destroyed == 0);
113 arena.makeArrayDefault<int>(10);
114 int* zeroed = arena.makeArray<int>(10);
115 for (int i = 0; i < 10; i++) {
116 REPORTER_ASSERT(r, zeroed[i] == 0);
117 }
118 Foo* fooArray = arena.makeArrayDefault<Foo>(10);
119 REPORTER_ASSERT(r, fooArray[3].x == -2);
120 REPORTER_ASSERT(r, fooArray[4].y == -3.0f);
121 REPORTER_ASSERT(r, created == 11);
122 REPORTER_ASSERT(r, destroyed == 0);
Mike Kleinfb5850f2020-11-09 15:50:37 -0600123 arena.make<OddAlignment>();
Herb Derbyac04fef2017-01-13 17:34:33 -0500124 }
125 REPORTER_ASSERT(r, created == 11);
126 REPORTER_ASSERT(r, destroyed == 11);
127
128 {
129 created = 0;
130 destroyed = 0;
131 std::unique_ptr<char[]> block{new char[1024]};
Herb Derbydcbe2c82017-04-14 14:51:27 -0400132 SkArenaAlloc arena{block.get(), 1024, 0};
Herb Derbyac04fef2017-01-13 17:34:33 -0500133
134 REPORTER_ASSERT(r, *arena.make<int>(3) == 3);
135 Foo* foo = arena.make<Foo>(3, 4.0f);
136 REPORTER_ASSERT(r, foo->x == 3);
137 REPORTER_ASSERT(r, foo->y == 4.0f);
138 REPORTER_ASSERT(r, created == 1);
139 REPORTER_ASSERT(r, destroyed == 0);
140 arena.makeArrayDefault<int>(10);
141 int* zeroed = arena.makeArray<int>(10);
142 for (int i = 0; i < 10; i++) {
143 REPORTER_ASSERT(r, zeroed[i] == 0);
144 }
145 Foo* fooArray = arena.makeArrayDefault<Foo>(10);
146 REPORTER_ASSERT(r, fooArray[3].x == -2);
147 REPORTER_ASSERT(r, fooArray[4].y == -3.0f);
148 REPORTER_ASSERT(r, created == 11);
149 REPORTER_ASSERT(r, destroyed == 0);
Mike Kleinfb5850f2020-11-09 15:50:37 -0600150 arena.make<OddAlignment>();
Herb Derbyac04fef2017-01-13 17:34:33 -0500151 }
152 REPORTER_ASSERT(r, created == 11);
153 REPORTER_ASSERT(r, destroyed == 11);
Herb Derby593cb942017-01-19 14:28:49 -0500154
155 {
Herb Derby6e2c56f2020-08-01 16:26:04 -0400156 SkSTArenaAllocWithReset<64> arena;
Herb Derby593cb942017-01-19 14:28:49 -0500157 arena.makeArrayDefault<char>(256);
158 arena.reset();
159 arena.reset();
160 }
161
162 {
163 created = 0;
164 destroyed = 0;
Florin Malita14a64302017-05-24 14:53:44 -0400165 SkSTArenaAlloc<64> arena;
Herb Derby593cb942017-01-19 14:28:49 -0500166
167 Start start;
168 Node* current = nullptr;
169 for (int i = 0; i < 128; i++) {
170 uint64_t* temp = arena.makeArrayDefault<uint64_t>(sizeof(Node) / sizeof(Node*));
171 current = new (temp)Node(current);
172 }
173 start.start = current;
174 }
175
Herb Derby8f3963f2020-05-13 14:53:40 -0400176 {
177 SkSTArenaAlloc<64> arena;
178 auto a = arena.makeInitializedArray<int>(8, [](size_t i ) { return i; });
179 for (size_t i = 0; i < 8; i++) {
180 REPORTER_ASSERT(r, a[i] == (int)i);
181 }
182 }
183
Herb Derby593cb942017-01-19 14:28:49 -0500184 REPORTER_ASSERT(r, created == 128);
185 REPORTER_ASSERT(r, destroyed == 128);
Herb Derby68521702017-02-06 13:03:49 -0500186
Florin Malita26c24ed2020-09-08 14:59:16 -0400187 {
188 SkArenaAlloc arena(4096);
189 arena.makeBytesAlignedTo(4081, 8);
190 }
Herb Derbyac04fef2017-01-13 17:34:33 -0500191}