示例#1
0
Metachunk* Metachunk::initialize(MetaWord* ptr, size_t word_size) {
  // Set bottom, top, and end.  Allow space for the Metachunk itself
  Metachunk* chunk = (Metachunk*) ptr;

  MetaWord* chunk_bottom = ptr + _overhead;
  chunk->set_bottom(ptr);
  chunk->set_top(chunk_bottom);
  MetaWord* chunk_end = ptr + word_size;
  assert(chunk_end > chunk_bottom, "Chunk must be too small");
  chunk->set_end(chunk_end);
  chunk->set_next(NULL);
  chunk->set_prev(NULL);
  chunk->set_word_size(word_size);
#ifdef ASSERT
  size_t data_word_size = pointer_delta(chunk_end, chunk_bottom, sizeof(MetaWord));
  Copy::fill_to_words((HeapWord*) chunk_bottom, data_word_size, metadata_chunk_initialize);
#endif
  return chunk;
}
示例#2
0
TEST(Metachunk, basic) {
  size_t size = 2 * 1024 * 1024;
  void* memory = malloc(size);
  ASSERT_TRUE(NULL != memory) << "Failed to malloc 2MB";

  Metachunk* metachunk = ::new (memory) Metachunk(size / BytesPerWord, NULL);

  EXPECT_EQ((MetaWord*) metachunk, metachunk->bottom());
  EXPECT_EQ((uintptr_t*) metachunk + metachunk->size(), metachunk->end());

  // Check sizes
  EXPECT_EQ(metachunk->size(), metachunk->word_size());
  EXPECT_EQ(pointer_delta(metachunk->end(), metachunk->bottom(),
                sizeof (MetaWord*)),
            metachunk->word_size());

  // Check usage
  EXPECT_EQ(metachunk->used_word_size(), metachunk->overhead());
  EXPECT_EQ(metachunk->word_size() - metachunk->used_word_size(),
            metachunk->free_word_size());
  EXPECT_EQ(MetachunkTest::top(metachunk), MetachunkTest::initial_top(metachunk));
  EXPECT_TRUE(metachunk->is_empty());

  // Allocate
  size_t alloc_size = 64; // Words
  EXPECT_TRUE(is_size_aligned(alloc_size, Metachunk::object_alignment()));

  MetaWord* mem = metachunk->allocate(alloc_size);

  // Check post alloc
  EXPECT_EQ(MetachunkTest::initial_top(metachunk), mem);
  EXPECT_EQ(MetachunkTest::top(metachunk), mem + alloc_size);
  EXPECT_EQ(metachunk->overhead() + alloc_size, metachunk->used_word_size());
  EXPECT_EQ(metachunk->word_size() - metachunk->used_word_size(),
            metachunk->free_word_size());
  EXPECT_FALSE(metachunk->is_empty());

  // Clear chunk
  metachunk->reset_empty();

  // Check post clear
  EXPECT_EQ(metachunk->used_word_size(), metachunk->overhead());
  EXPECT_EQ(metachunk->word_size() - metachunk->used_word_size(),
            metachunk->free_word_size());
  EXPECT_EQ(MetachunkTest::top(metachunk), MetachunkTest::initial_top(metachunk));
  EXPECT_TRUE(metachunk->is_empty());

  free(memory);
}
示例#3
0
  static void test() {
    size_t size = 2 * 1024 * 1024;
    void* memory = malloc(size);
    assert(memory != NULL, "Failed to malloc 2MB");

    Metachunk* metachunk = ::new (memory) Metachunk(size / BytesPerWord, NULL);

    assert(metachunk->bottom() == (MetaWord*)metachunk, "assert");
    assert(metachunk->end() == (uintptr_t*)metachunk + metachunk->size(), "assert");

    // Check sizes
    assert(metachunk->size() == metachunk->word_size(), "assert");
    assert(metachunk->word_size() == pointer_delta(metachunk->end(), metachunk->bottom(),
        sizeof(MetaWord*)), "assert");

    // Check usage
    assert(metachunk->used_word_size() == metachunk->overhead(), "assert");
    assert(metachunk->free_word_size() == metachunk->word_size() - metachunk->used_word_size(), "assert");
    assert(metachunk->top() == metachunk->initial_top(), "assert");
    assert(metachunk->is_empty(), "assert");

    // Allocate
    size_t alloc_size = 64; // Words
    assert(is_size_aligned(alloc_size, Metachunk::object_alignment()), "assert");

    MetaWord* mem = metachunk->allocate(alloc_size);

    // Check post alloc
    assert(mem == metachunk->initial_top(), "assert");
    assert(mem + alloc_size == metachunk->top(), "assert");
    assert(metachunk->used_word_size() == metachunk->overhead() + alloc_size, "assert");
    assert(metachunk->free_word_size() == metachunk->word_size() - metachunk->used_word_size(), "assert");
    assert(!metachunk->is_empty(), "assert");

    // Clear chunk
    metachunk->reset_empty();

    // Check post clear
    assert(metachunk->used_word_size() == metachunk->overhead(), "assert");
    assert(metachunk->free_word_size() == metachunk->word_size() - metachunk->used_word_size(), "assert");
    assert(metachunk->top() == metachunk->initial_top(), "assert");
    assert(metachunk->is_empty(), "assert");

    free(memory);
  }