blob: 6323a2b97c49f99aa32479f783b898f781eaf0a5 [file] [log] [blame]
Vladimir Marko3e0e7172016-04-22 18:07:13 +01001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
David Sehr1979c642018-04-26 14:41:18 -070017#include "arena_allocator-inl.h"
18#include "arena_bit_vector.h"
Roland Levillain05e34f42018-05-24 13:19:05 +000019#include "base/common_art_test.h"
Vladimir Marko3e0e7172016-04-22 18:07:13 +010020#include "gtest/gtest.h"
David Sehr1979c642018-04-26 14:41:18 -070021#include "malloc_arena_pool.h"
22#include "memory_tool.h"
Vladimir Marko3e0e7172016-04-22 18:07:13 +010023
24namespace art {
25
26class ArenaAllocatorTest : public testing::Test {
27 protected:
Vladimir Markoe764d2e2017-10-05 14:35:55 +010028 size_t NumberOfArenas(ArenaAllocator* allocator) {
Vladimir Marko3e0e7172016-04-22 18:07:13 +010029 size_t result = 0u;
Vladimir Markoe764d2e2017-10-05 14:35:55 +010030 for (Arena* a = allocator->arena_head_; a != nullptr; a = a->next_) {
Vladimir Marko3e0e7172016-04-22 18:07:13 +010031 ++result;
32 }
33 return result;
34 }
35};
36
37TEST_F(ArenaAllocatorTest, Test) {
David Sehr3215fff2018-04-03 17:10:12 -070038 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +010039 ArenaAllocator allocator(&pool);
40 ArenaBitVector bv(&allocator, 10, true);
Vladimir Marko3e0e7172016-04-22 18:07:13 +010041 bv.SetBit(5);
42 EXPECT_EQ(1U, bv.GetStorageSize());
43 bv.SetBit(35);
44 EXPECT_EQ(2U, bv.GetStorageSize());
45}
46
Vladimir Marko3f84f2c2016-04-25 19:40:34 +010047TEST_F(ArenaAllocatorTest, MakeDefined) {
48 // Regression test to make sure we mark the allocated area defined.
David Sehr3215fff2018-04-03 17:10:12 -070049 MallocArenaPool pool;
Vladimir Marko3f84f2c2016-04-25 19:40:34 +010050 static constexpr size_t kSmallArraySize = 10;
51 static constexpr size_t kLargeArraySize = 50;
52 uint32_t* small_array;
53 {
54 // Allocate a small array from an arena and release it.
Vladimir Marko69d310e2017-10-09 14:12:23 +010055 ArenaAllocator allocator(&pool);
56 small_array = allocator.AllocArray<uint32_t>(kSmallArraySize);
Vladimir Marko3f84f2c2016-04-25 19:40:34 +010057 ASSERT_EQ(0u, small_array[kSmallArraySize - 1u]);
58 }
59 {
60 // Reuse the previous arena and allocate more than previous allocation including red zone.
Vladimir Marko69d310e2017-10-09 14:12:23 +010061 ArenaAllocator allocator(&pool);
62 uint32_t* large_array = allocator.AllocArray<uint32_t>(kLargeArraySize);
Vladimir Marko3f84f2c2016-04-25 19:40:34 +010063 ASSERT_EQ(0u, large_array[kLargeArraySize - 1u]);
64 // Verify that the allocation was made on the same arena.
65 ASSERT_EQ(small_array, large_array);
66 }
67}
68
Vladimir Marko3e0e7172016-04-22 18:07:13 +010069TEST_F(ArenaAllocatorTest, LargeAllocations) {
Andreas Gampe121f1482017-05-12 10:28:35 -070070 if (arena_allocator::kArenaAllocatorPreciseTracking) {
71 printf("WARNING: TEST DISABLED FOR precise arena tracking\n");
72 return;
73 }
74
Vladimir Marko3e0e7172016-04-22 18:07:13 +010075 {
David Sehr3215fff2018-04-03 17:10:12 -070076 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +010077 ArenaAllocator allocator(&pool);
Vladimir Marko3e0e7172016-04-22 18:07:13 +010078 // Note: Leaving some space for memory tool red zones.
Vladimir Marko69d310e2017-10-09 14:12:23 +010079 void* alloc1 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 5 / 8);
80 void* alloc2 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 2 / 8);
Vladimir Marko3e0e7172016-04-22 18:07:13 +010081 ASSERT_NE(alloc1, alloc2);
Vladimir Marko69d310e2017-10-09 14:12:23 +010082 ASSERT_EQ(1u, NumberOfArenas(&allocator));
Vladimir Marko3e0e7172016-04-22 18:07:13 +010083 }
84 {
David Sehr3215fff2018-04-03 17:10:12 -070085 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +010086 ArenaAllocator allocator(&pool);
87 void* alloc1 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 13 / 16);
88 void* alloc2 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 11 / 16);
Vladimir Marko3e0e7172016-04-22 18:07:13 +010089 ASSERT_NE(alloc1, alloc2);
Vladimir Marko69d310e2017-10-09 14:12:23 +010090 ASSERT_EQ(2u, NumberOfArenas(&allocator));
91 void* alloc3 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 7 / 16);
Vladimir Marko3e0e7172016-04-22 18:07:13 +010092 ASSERT_NE(alloc1, alloc3);
93 ASSERT_NE(alloc2, alloc3);
Vladimir Marko69d310e2017-10-09 14:12:23 +010094 ASSERT_EQ(3u, NumberOfArenas(&allocator));
Vladimir Marko3e0e7172016-04-22 18:07:13 +010095 }
96 {
David Sehr3215fff2018-04-03 17:10:12 -070097 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +010098 ArenaAllocator allocator(&pool);
99 void* alloc1 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 13 / 16);
100 void* alloc2 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 9 / 16);
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100101 ASSERT_NE(alloc1, alloc2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100102 ASSERT_EQ(2u, NumberOfArenas(&allocator));
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100103 // Note: Leaving some space for memory tool red zones.
Vladimir Marko69d310e2017-10-09 14:12:23 +0100104 void* alloc3 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 5 / 16);
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100105 ASSERT_NE(alloc1, alloc3);
106 ASSERT_NE(alloc2, alloc3);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100107 ASSERT_EQ(2u, NumberOfArenas(&allocator));
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100108 }
109 {
David Sehr3215fff2018-04-03 17:10:12 -0700110 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100111 ArenaAllocator allocator(&pool);
112 void* alloc1 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 9 / 16);
113 void* alloc2 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 13 / 16);
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100114 ASSERT_NE(alloc1, alloc2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100115 ASSERT_EQ(2u, NumberOfArenas(&allocator));
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100116 // Note: Leaving some space for memory tool red zones.
Vladimir Marko69d310e2017-10-09 14:12:23 +0100117 void* alloc3 = allocator.Alloc(arena_allocator::kArenaDefaultSize * 5 / 16);
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100118 ASSERT_NE(alloc1, alloc3);
119 ASSERT_NE(alloc2, alloc3);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100120 ASSERT_EQ(2u, NumberOfArenas(&allocator));
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100121 }
122 {
David Sehr3215fff2018-04-03 17:10:12 -0700123 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100124 ArenaAllocator allocator(&pool);
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100125 // Note: Leaving some space for memory tool red zones.
126 for (size_t i = 0; i != 15; ++i) {
Vladimir Marko69d310e2017-10-09 14:12:23 +0100127 // Allocate 15 times from the same arena.
128 allocator.Alloc(arena_allocator::kArenaDefaultSize * 1 / 16);
129 ASSERT_EQ(i + 1u, NumberOfArenas(&allocator));
130 // Allocate a separate arena.
131 allocator.Alloc(arena_allocator::kArenaDefaultSize * 17 / 16);
132 ASSERT_EQ(i + 2u, NumberOfArenas(&allocator));
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100133 }
134 }
135}
136
Andreas Gampec134ee72016-08-22 14:03:10 -0700137TEST_F(ArenaAllocatorTest, AllocAlignment) {
David Sehr3215fff2018-04-03 17:10:12 -0700138 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100139 ArenaAllocator allocator(&pool);
Andreas Gampec134ee72016-08-22 14:03:10 -0700140 for (size_t iterations = 0; iterations <= 10; ++iterations) {
141 for (size_t size = 1; size <= ArenaAllocator::kAlignment + 1; ++size) {
Vladimir Marko69d310e2017-10-09 14:12:23 +0100142 void* allocation = allocator.Alloc(size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700143 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(allocation))
144 << reinterpret_cast<uintptr_t>(allocation);
145 }
146 }
147}
148
Andreas Gampe6206da52016-08-22 19:14:29 -0700149TEST_F(ArenaAllocatorTest, ReallocReuse) {
Roland Levillain05e34f42018-05-24 13:19:05 +0000150 // Realloc does not reuse arenas when running under sanitization.
151 TEST_DISABLED_FOR_MEMORY_TOOL();
Andreas Gampe6206da52016-08-22 19:14:29 -0700152
153 {
154 // Case 1: small aligned allocation, aligned extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700155 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100156 ArenaAllocator allocator(&pool);
Andreas Gampe6206da52016-08-22 19:14:29 -0700157
158 const size_t original_size = ArenaAllocator::kAlignment * 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100159 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700160
161 const size_t new_size = ArenaAllocator::kAlignment * 3;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100162 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700163 EXPECT_EQ(original_allocation, realloc_allocation);
164 }
165
166 {
167 // Case 2: small aligned allocation, non-aligned extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700168 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100169 ArenaAllocator allocator(&pool);
Andreas Gampe6206da52016-08-22 19:14:29 -0700170
171 const size_t original_size = ArenaAllocator::kAlignment * 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100172 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700173
174 const size_t new_size = ArenaAllocator::kAlignment * 2 + (ArenaAllocator::kAlignment / 2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100175 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700176 EXPECT_EQ(original_allocation, realloc_allocation);
177 }
178
179 {
180 // Case 3: small non-aligned allocation, aligned extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700181 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100182 ArenaAllocator allocator(&pool);
Andreas Gampe6206da52016-08-22 19:14:29 -0700183
184 const size_t original_size = ArenaAllocator::kAlignment * 2 + (ArenaAllocator::kAlignment / 2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100185 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700186
187 const size_t new_size = ArenaAllocator::kAlignment * 4;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100188 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700189 EXPECT_EQ(original_allocation, realloc_allocation);
190 }
191
192 {
193 // Case 4: small non-aligned allocation, aligned non-extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700194 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100195 ArenaAllocator allocator(&pool);
Andreas Gampe6206da52016-08-22 19:14:29 -0700196
197 const size_t original_size = ArenaAllocator::kAlignment * 2 + (ArenaAllocator::kAlignment / 2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100198 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700199
200 const size_t new_size = ArenaAllocator::kAlignment * 3;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100201 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700202 EXPECT_EQ(original_allocation, realloc_allocation);
203 }
204
205 // The next part is brittle, as the default size for an arena is variable, and we don't know about
206 // sanitization.
207
208 {
209 // Case 5: large allocation, aligned extend into next arena.
David Sehr3215fff2018-04-03 17:10:12 -0700210 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100211 ArenaAllocator allocator(&pool);
Andreas Gampe6206da52016-08-22 19:14:29 -0700212
Andreas Gampe121f1482017-05-12 10:28:35 -0700213 const size_t original_size = arena_allocator::kArenaDefaultSize -
214 ArenaAllocator::kAlignment * 5;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100215 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700216
Andreas Gampe121f1482017-05-12 10:28:35 -0700217 const size_t new_size = arena_allocator::kArenaDefaultSize + ArenaAllocator::kAlignment * 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100218 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700219 EXPECT_NE(original_allocation, realloc_allocation);
220 }
221
222 {
223 // Case 6: large allocation, non-aligned extend into next arena.
David Sehr3215fff2018-04-03 17:10:12 -0700224 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100225 ArenaAllocator allocator(&pool);
Andreas Gampe6206da52016-08-22 19:14:29 -0700226
Andreas Gampe121f1482017-05-12 10:28:35 -0700227 const size_t original_size = arena_allocator::kArenaDefaultSize -
Andreas Gampe6206da52016-08-22 19:14:29 -0700228 ArenaAllocator::kAlignment * 4 -
229 ArenaAllocator::kAlignment / 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100230 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700231
Andreas Gampe121f1482017-05-12 10:28:35 -0700232 const size_t new_size = arena_allocator::kArenaDefaultSize +
Andreas Gampe6206da52016-08-22 19:14:29 -0700233 ArenaAllocator::kAlignment * 2 +
234 ArenaAllocator::kAlignment / 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100235 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampe6206da52016-08-22 19:14:29 -0700236 EXPECT_NE(original_allocation, realloc_allocation);
237 }
238}
239
Andreas Gampec134ee72016-08-22 14:03:10 -0700240TEST_F(ArenaAllocatorTest, ReallocAlignment) {
241 {
242 // Case 1: small aligned allocation, aligned extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700243 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100244 ArenaAllocator allocator(&pool);
Andreas Gampec134ee72016-08-22 14:03:10 -0700245
246 const size_t original_size = ArenaAllocator::kAlignment * 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100247 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700248 ASSERT_TRUE(IsAligned<ArenaAllocator::kAlignment>(original_allocation));
249
250 const size_t new_size = ArenaAllocator::kAlignment * 3;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100251 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700252 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(realloc_allocation));
Andreas Gampec134ee72016-08-22 14:03:10 -0700253
Vladimir Marko69d310e2017-10-09 14:12:23 +0100254 void* after_alloc = allocator.Alloc(1);
Andreas Gampec134ee72016-08-22 14:03:10 -0700255 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(after_alloc));
256 }
257
258 {
259 // Case 2: small aligned allocation, non-aligned extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700260 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100261 ArenaAllocator allocator(&pool);
Andreas Gampec134ee72016-08-22 14:03:10 -0700262
263 const size_t original_size = ArenaAllocator::kAlignment * 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100264 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700265 ASSERT_TRUE(IsAligned<ArenaAllocator::kAlignment>(original_allocation));
266
267 const size_t new_size = ArenaAllocator::kAlignment * 2 + (ArenaAllocator::kAlignment / 2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100268 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700269 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(realloc_allocation));
Andreas Gampec134ee72016-08-22 14:03:10 -0700270
Vladimir Marko69d310e2017-10-09 14:12:23 +0100271 void* after_alloc = allocator.Alloc(1);
Andreas Gampec134ee72016-08-22 14:03:10 -0700272 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(after_alloc));
273 }
274
275 {
276 // Case 3: small non-aligned allocation, aligned extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700277 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100278 ArenaAllocator allocator(&pool);
Andreas Gampec134ee72016-08-22 14:03:10 -0700279
280 const size_t original_size = ArenaAllocator::kAlignment * 2 + (ArenaAllocator::kAlignment / 2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100281 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700282 ASSERT_TRUE(IsAligned<ArenaAllocator::kAlignment>(original_allocation));
283
284 const size_t new_size = ArenaAllocator::kAlignment * 4;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100285 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700286 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(realloc_allocation));
Andreas Gampec134ee72016-08-22 14:03:10 -0700287
Vladimir Marko69d310e2017-10-09 14:12:23 +0100288 void* after_alloc = allocator.Alloc(1);
Andreas Gampec134ee72016-08-22 14:03:10 -0700289 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(after_alloc));
290 }
291
292 {
293 // Case 4: small non-aligned allocation, aligned non-extend inside arena.
David Sehr3215fff2018-04-03 17:10:12 -0700294 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100295 ArenaAllocator allocator(&pool);
Andreas Gampec134ee72016-08-22 14:03:10 -0700296
297 const size_t original_size = ArenaAllocator::kAlignment * 2 + (ArenaAllocator::kAlignment / 2);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100298 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700299 ASSERT_TRUE(IsAligned<ArenaAllocator::kAlignment>(original_allocation));
300
301 const size_t new_size = ArenaAllocator::kAlignment * 3;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100302 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700303 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(realloc_allocation));
Andreas Gampec134ee72016-08-22 14:03:10 -0700304
Vladimir Marko69d310e2017-10-09 14:12:23 +0100305 void* after_alloc = allocator.Alloc(1);
Andreas Gampec134ee72016-08-22 14:03:10 -0700306 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(after_alloc));
307 }
308
309 // The next part is brittle, as the default size for an arena is variable, and we don't know about
310 // sanitization.
311
312 {
313 // Case 5: large allocation, aligned extend into next arena.
David Sehr3215fff2018-04-03 17:10:12 -0700314 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100315 ArenaAllocator allocator(&pool);
Andreas Gampec134ee72016-08-22 14:03:10 -0700316
Andreas Gampe121f1482017-05-12 10:28:35 -0700317 const size_t original_size = arena_allocator::kArenaDefaultSize -
318 ArenaAllocator::kAlignment * 5;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100319 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700320 ASSERT_TRUE(IsAligned<ArenaAllocator::kAlignment>(original_allocation));
321
Andreas Gampe121f1482017-05-12 10:28:35 -0700322 const size_t new_size = arena_allocator::kArenaDefaultSize + ArenaAllocator::kAlignment * 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100323 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700324 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(realloc_allocation));
Andreas Gampec134ee72016-08-22 14:03:10 -0700325
Vladimir Marko69d310e2017-10-09 14:12:23 +0100326 void* after_alloc = allocator.Alloc(1);
Andreas Gampec134ee72016-08-22 14:03:10 -0700327 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(after_alloc));
328 }
329
330 {
331 // Case 6: large allocation, non-aligned extend into next arena.
David Sehr3215fff2018-04-03 17:10:12 -0700332 MallocArenaPool pool;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100333 ArenaAllocator allocator(&pool);
Andreas Gampec134ee72016-08-22 14:03:10 -0700334
Andreas Gampe121f1482017-05-12 10:28:35 -0700335 const size_t original_size = arena_allocator::kArenaDefaultSize -
Andreas Gampec134ee72016-08-22 14:03:10 -0700336 ArenaAllocator::kAlignment * 4 -
337 ArenaAllocator::kAlignment / 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100338 void* original_allocation = allocator.Alloc(original_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700339 ASSERT_TRUE(IsAligned<ArenaAllocator::kAlignment>(original_allocation));
340
Andreas Gampe121f1482017-05-12 10:28:35 -0700341 const size_t new_size = arena_allocator::kArenaDefaultSize +
Andreas Gampec134ee72016-08-22 14:03:10 -0700342 ArenaAllocator::kAlignment * 2 +
343 ArenaAllocator::kAlignment / 2;
Vladimir Marko69d310e2017-10-09 14:12:23 +0100344 void* realloc_allocation = allocator.Realloc(original_allocation, original_size, new_size);
Andreas Gampec134ee72016-08-22 14:03:10 -0700345 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(realloc_allocation));
Andreas Gampec134ee72016-08-22 14:03:10 -0700346
Vladimir Marko69d310e2017-10-09 14:12:23 +0100347 void* after_alloc = allocator.Alloc(1);
Andreas Gampec134ee72016-08-22 14:03:10 -0700348 EXPECT_TRUE(IsAligned<ArenaAllocator::kAlignment>(after_alloc));
349 }
350}
351
352
Vladimir Marko3e0e7172016-04-22 18:07:13 +0100353} // namespace art