test/hotspot/gtest/metaspace/test_blockListArray.cpp
branchstuefe-new-metaspace-branch
changeset 59271 1558266946de
parent 59238 6ce12ce00d3e
equal deleted inserted replaced
59257:990b1fed3b47 59271:1558266946de
    29 
    29 
    30 #include "metaspaceTestsCommon.hpp"
    30 #include "metaspaceTestsCommon.hpp"
    31 
    31 
    32 TEST_VM(metaspace, BlockListFreeMap_mask_basic) {
    32 TEST_VM(metaspace, BlockListFreeMap_mask_basic) {
    33   // Basic tests
    33   // Basic tests
    34   metaspace::BlockListFreeMap map;
    34   metaspace::BlockListArrayMask map;
    35   EXPECT_TRUE(map.all_zero());
    35   EXPECT_TRUE(map.all_zero());
    36   for (int i = 0; i < map.size(); i ++) {
    36   for (int i = 0; i < map.size(); i ++) {
    37     map.set_bit(i);
    37     map.set_bit(i);
    38     EXPECT_TRUE(map.get_bit(i));
    38     EXPECT_TRUE(map.get_bit(i));
    39     map.clr_bit(i);
    39     map.clr_bit(i);
    41     EXPECT_TRUE(map.all_zero());
    41     EXPECT_TRUE(map.all_zero());
    42   }
    42   }
    43 }
    43 }
    44 
    44 
    45 TEST_VM(metaspace, BlockListFreeMap_mask_find_next_set_bit) {
    45 TEST_VM(metaspace, BlockListFreeMap_mask_find_next_set_bit) {
    46   metaspace::BlockListFreeMap map;
    46   metaspace::BlockListArrayMask map;
    47   EXPECT_TRUE(map.all_zero());
    47   EXPECT_TRUE(map.all_zero());
    48   for (int i = 0; i < map.size(); i ++) {
    48   for (int i = 0; i < map.size(); i ++) {
    49     map.set_bit(i);
    49     map.set_bit(i);
    50     for (int j = 0; j < i; j ++) {
    50     for (int j = 0; j < i; j ++) {
    51       int n = map.find_next_set_bit(j);
    51       int n = map.find_next_set_bit(j);
    52       if (j <= i) {
    52       if (j < i) {
    53         EXPECT_EQ(n, i);
    53         EXPECT_EQ(n, i);
    54       } else {
    54       } else {
    55         EXPECT_EQ(n, -1);
    55         EXPECT_EQ(n, -1);
    56       }
    56       }
    57     }
    57     }
    58     map.clr_bit(i);
    58     map.clr_bit(i);
    59   }
    59   }
    60 }
    60 }
    61 
    61 
       
    62 #define CHECK_BLA_CONTENT(BLA, NUM_EXPECTED, SIZE_EXPECTED) \
       
    63 { \
       
    64   metaspace::block_stats_t stat; \
       
    65   memset(&stat, 0xFF, sizeof(stat)); \
       
    66   BLA.statistics(&stat); \
       
    67   ASSERT_EQ(stat.num_blocks, (int)NUM_EXPECTED); \
       
    68   ASSERT_EQ(stat.word_size, (size_t)SIZE_EXPECTED); \
       
    69   if (NUM_EXPECTED == 0) { \
       
    70 	  ASSERT_TRUE(BLA.is_empty()); \
       
    71   } else { \
       
    72 	  ASSERT_FALSE(BLA.is_empty()); \
       
    73   } \
       
    74 }
       
    75 
       
    76 
       
    77 
       
    78 TEST_VM(metaspace, BlockListArray_basic) {
       
    79 
       
    80   metaspace::BlockListArray<100, 5, 20> bla;
       
    81   ASSERT_EQ(bla.maximal_word_size(), (size_t)200);
       
    82   ASSERT_EQ(bla.minimal_word_size(), (size_t)100);
       
    83 
       
    84   CHECK_BLA_CONTENT(bla, 0, 0);
       
    85 
       
    86   // Put something into the bla and check bla.
       
    87   // Take something out of the bla; any allocation smaller
       
    88   // than the one block in it shall succeed.
       
    89   MetaWord tmp[1024];
       
    90 
       
    91   for (size_t feeding_size = 100; feeding_size < 200; feeding_size ++) {
       
    92     for (size_t l = 100; l < 200; l ++) {
       
    93       LOG(SIZE_FORMAT "-" SIZE_FORMAT, feeding_size, l);
       
    94 
       
    95       bla.put(tmp, feeding_size);
       
    96       CHECK_BLA_CONTENT(bla, 1, feeding_size);
       
    97 
       
    98       metaspace::block_t* b = bla.get(l);
       
    99 
       
   100       if (l <= feeding_size) {
       
   101         // We expect the get() to work and return the block we just put in
       
   102         // if the size we ask for is smaller than the size we put in.
       
   103         ASSERT_NOT_NULL(b);
       
   104         ASSERT_EQ((MetaWord*) b, tmp);
       
   105         ASSERT_EQ(b->size, feeding_size);
       
   106         CHECK_BLA_CONTENT(bla, 0, 0);
       
   107         memset(b, 0xDE, b->size * sizeof(MetaWord));
       
   108       } else {
       
   109         // Otherwise we expect the bla to be unchanged.
       
   110         assert(b == NULL, "s");
       
   111         ASSERT_NULL(b);
       
   112         CHECK_BLA_CONTENT(bla, 1, feeding_size);
       
   113       }
       
   114       DEBUG_ONLY(bla.verify();)
       
   115 
       
   116       // Regardless of bla's state, empty it out for the next iteration.
       
   117       bla.get(feeding_size);
       
   118       CHECK_BLA_CONTENT(bla, 0, 0);
       
   119     }
       
   120   }
       
   121 }
       
   122 
       
   123 TEST_VM(metaspace, BlockListArray_fill_and_drain) {
       
   124 
       
   125   metaspace::BlockListArray<100, 5, 20> bla;
       
   126   ASSERT_EQ(bla.maximal_word_size(), (size_t)200);
       
   127   ASSERT_EQ(bla.minimal_word_size(), (size_t)100);
       
   128 
       
   129   CHECK_BLA_CONTENT(bla, 0, 0);
       
   130 
       
   131   // Now feed it some memory:
       
   132   FeederBuffer fb(16 * K);
       
   133   RandSizeGenerator rgen(100, 200);
       
   134   int num_fed = 0;
       
   135   size_t size_fed = 0;
       
   136   MetaWord* p = NULL;
       
   137   do {
       
   138     const size_t s = rgen.get();
       
   139     p = fb.get(s);
       
   140     if (p != NULL) {
       
   141       num_fed ++;
       
   142       size_fed += s;
       
   143       bla.put(p, s);
       
   144       CHECK_BLA_CONTENT(bla, num_fed, size_fed);
       
   145     }
       
   146   } while (p != NULL);
       
   147 
       
   148   DEBUG_ONLY(bla.verify();)
       
   149 
       
   150   // Now remove memory until empty:
       
   151   int num_retrieved = 0;
       
   152   size_t size_retrieved = 0;
       
   153   metaspace::block_t* b = NULL;
       
   154   do {
       
   155     const size_t s = rgen.get();
       
   156     metaspace::block_t* b = bla.get(s);
       
   157     if (p != NULL) {
       
   158       ASSERT_GE(b->size, s);
       
   159       num_retrieved ++;
       
   160       size_retrieved += b->size;
       
   161       memset(b, 0xDE, b->size * BytesPerWord);
       
   162       CHECK_BLA_CONTENT(bla, num_fed - num_retrieved,
       
   163                              size_fed - size_retrieved);
       
   164       ASSERT_LE(num_retrieved, num_fed);
       
   165       ASSERT_LE(size_retrieved, size_fed);
       
   166     }
       
   167 
       
   168   } while (p != NULL);
       
   169 
       
   170   DEBUG_ONLY(bla.verify();)
       
   171 
       
   172 }
       
   173