27 |
27 |
28 //#define LOG_PLEASE |
28 //#define LOG_PLEASE |
29 |
29 |
30 #include "metaspaceTestsCommon.hpp" |
30 #include "metaspaceTestsCommon.hpp" |
31 |
31 |
|
32 #define CHECK_LOM_CONTENT(lom, num_blocks_expected, word_size_expected) \ |
|
33 { \ |
|
34 if (word_size_expected > 0) { \ |
|
35 EXPECT_FALSE(lom.is_empty()); \ |
|
36 } else { \ |
|
37 EXPECT_TRUE(lom.is_empty()); \ |
|
38 } \ |
|
39 EXPECT_EQ(lom.total_word_size(), (size_t)word_size_expected); \ |
|
40 metaspace::block_stats_t s; \ |
|
41 memset(&s, 0xDD, sizeof(s)); \ |
|
42 lom.statistics(&s); \ |
|
43 EXPECT_EQ((size_t)word_size_expected, s.word_size); \ |
|
44 if (num_blocks_expected >= 0) { \ |
|
45 EXPECT_EQ(num_blocks_expected, s.num_blocks); \ |
|
46 } \ |
|
47 } |
|
48 |
32 class LeftOverBinsTest { |
49 class LeftOverBinsTest { |
33 |
|
34 // A simple preallocated buffer used to "feed" the allocator. |
|
35 // Mimicks chunk retirement leftover blocks. |
|
36 class FeederBuffer { |
|
37 |
|
38 static const size_t buf_word_size = 512 * K; |
|
39 MetaWord* _buf; |
|
40 size_t _used; |
|
41 |
|
42 public: |
|
43 |
|
44 FeederBuffer() : _used(0) { |
|
45 _buf = NEW_C_HEAP_ARRAY(MetaWord, buf_word_size, mtInternal); |
|
46 } |
|
47 |
|
48 ~FeederBuffer() { |
|
49 FREE_C_HEAP_ARRAY(MetaWord, _buf); |
|
50 } |
|
51 |
|
52 MetaWord* get(size_t word_size) { |
|
53 if (_used > (buf_word_size - word_size)) { |
|
54 return NULL; |
|
55 } |
|
56 MetaWord* p = _buf + _used; |
|
57 _used += word_size; |
|
58 return p; |
|
59 } |
|
60 |
|
61 }; |
|
62 |
50 |
63 FeederBuffer _fb; |
51 FeederBuffer _fb; |
64 LeftOverManager _lom; |
52 LeftOverManager _lom; |
65 |
53 |
66 // random generator for block feeding |
54 // random generator for block feeding |
185 |
172 |
186 |
173 |
187 public: |
174 public: |
188 |
175 |
189 LeftOverBinsTest(size_t avg_alloc_size) : |
176 LeftOverBinsTest(size_t avg_alloc_size) : |
190 _fb(), _lom(), |
177 _fb(512 * K), _lom(), |
191 _rgen_feeding(128, 4096), |
178 _rgen_feeding(128, 4096), |
192 _rgen_allocations(avg_alloc_size / 4, avg_alloc_size * 2, 0.01f, avg_alloc_size / 3, avg_alloc_size * 30), |
179 _rgen_allocations(avg_alloc_size / 4, avg_alloc_size * 2, 0.01f, avg_alloc_size / 3, avg_alloc_size * 30), |
193 _allocations(NULL), |
180 _allocations(NULL), |
194 _num_allocs(0), _num_deallocs(0), _num_feeds(0) |
181 _num_allocs(0), _num_deallocs(0), _num_feeds(0) |
195 { |
182 { |
|
183 CHECK_LOM_CONTENT(_lom, 0, 0); |
196 // some initial feeding |
184 // some initial feeding |
197 _lom.add_block(_fb.get(1024), 1024); |
185 _lom.add_block(_fb.get(1024), 1024); |
|
186 CHECK_LOM_CONTENT(_lom, 1, 1024); |
198 } |
187 } |
199 |
188 |
200 |
189 |
201 static void test_small_allocations() { |
190 static void test_small_allocations() { |
202 LeftOverBinsTest test(10); |
191 LeftOverBinsTest test(10); |
220 TEST_VM(metaspace, leftoverbins_basics) { |
209 TEST_VM(metaspace, leftoverbins_basics) { |
221 |
210 |
222 LeftOverManager lom; |
211 LeftOverManager lom; |
223 MetaWord tmp[1024]; |
212 MetaWord tmp[1024]; |
224 metaspace::block_stats_t stats; |
213 metaspace::block_stats_t stats; |
|
214 CHECK_LOM_CONTENT(lom, 0, 0); |
225 |
215 |
226 lom.add_block(tmp, 1024); |
216 lom.add_block(tmp, 1024); |
227 DEBUG_ONLY(lom.verify();) |
217 DEBUG_ONLY(lom.verify();) |
228 |
218 ASSERT_FALSE(lom.is_empty()); |
229 lom.statistics(&stats); |
219 CHECK_LOM_CONTENT(lom, 1, 1024); |
230 EXPECT_EQ(stats.num_blocks, 1); |
|
231 EXPECT_EQ(stats.word_size, (size_t)1024); |
|
232 |
220 |
233 MetaWord* p = lom.get_block(1024); |
221 MetaWord* p = lom.get_block(1024); |
234 EXPECT_EQ(p, tmp); |
222 EXPECT_EQ(p, tmp); |
235 DEBUG_ONLY(lom.verify();) |
223 DEBUG_ONLY(lom.verify();) |
236 |
224 CHECK_LOM_CONTENT(lom, 0, 0); |
237 lom.statistics(&stats); |
225 |
238 EXPECT_EQ(stats.num_blocks, 0); |
|
239 EXPECT_EQ(stats.word_size, (size_t)0); |
|
240 } |
226 } |
241 |
227 |
242 TEST_VM(metaspace, leftoverbins_small) { |
228 TEST_VM(metaspace, leftoverbins_small) { |
243 LeftOverBinsTest::test_small_allocations(); |
229 LeftOverBinsTest::test_small_allocations(); |
244 } |
230 } |