test/hotspot/gtest/metaspace/test_leftOverBins.cpp
branchstuefe-new-metaspace-branch
changeset 59271 1558266946de
parent 59238 6ce12ce00d3e
equal deleted inserted replaced
59257:990b1fed3b47 59271:1558266946de
    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
    77     MetaWord* p;
    65     MetaWord* p;
    78   };
    66   };
    79 
    67 
    80   // Array of the same size as the pool max capacity; holds the allocated elements.
    68   // Array of the same size as the pool max capacity; holds the allocated elements.
    81   allocation_t* _allocations;
    69   allocation_t* _allocations;
    82 
       
    83 
    70 
    84   int _num_allocs;
    71   int _num_allocs;
    85   int _num_deallocs;
    72   int _num_deallocs;
    86   int _num_feeds;
    73   int _num_feeds;
    87 
    74 
   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 }