blob: a64ce34f7fbf43dbce6d8358ae3cb03571a9d034 [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "platform/assert.h"
#include "vm/freelist.h"
#include "vm/unit_test.h"
namespace dart {
TEST_CASE(FreeList) {
FreeList* free_list = new FreeList();
intptr_t kBlobSize = 1 * MB;
intptr_t kSmallObjectSize = 4 * kWordSize;
intptr_t kMediumObjectSize = 16 * kWordSize;
intptr_t kLargeObjectSize = 8 * KB;
uword blob = reinterpret_cast<uword>(malloc(kBlobSize));
// Enqueue the large blob as one free block.
free_list->Free(blob, kBlobSize);
// Allocate a small object. Expect it to be positioned as the first element.
uword small_object = free_list->TryAllocate(kSmallObjectSize);
EXPECT_EQ(blob, small_object);
// Freeing and allocating should give us the same memory back.
free_list->Free(small_object, kSmallObjectSize);
small_object = free_list->TryAllocate(kSmallObjectSize);
EXPECT_EQ(blob, small_object);
// Splitting the remainder further with small and medium objects.
uword small_object2 = free_list->TryAllocate(kSmallObjectSize);
EXPECT_EQ(blob + kSmallObjectSize, small_object2);
uword med_object = free_list->TryAllocate(kMediumObjectSize);
EXPECT_EQ(small_object2 + kSmallObjectSize, med_object);
// Allocate a large object.
uword large_object = free_list->TryAllocate(kLargeObjectSize);
EXPECT_EQ(med_object + kMediumObjectSize, large_object);
// Make sure that small objects can still split the remainder.
uword small_object3 = free_list->TryAllocate(kSmallObjectSize);
EXPECT_EQ(large_object + kLargeObjectSize, small_object3);
// Split the large object.
free_list->Free(large_object, kLargeObjectSize);
uword small_object4 = free_list->TryAllocate(kSmallObjectSize);
EXPECT_EQ(large_object, small_object4);
// Get the full remainder of the large object.
large_object = free_list->TryAllocate(kLargeObjectSize - kSmallObjectSize);
EXPECT_EQ(small_object4 + kSmallObjectSize, large_object);
// Get another large object from the large unallocated remainder.
uword large_object2 = free_list->TryAllocate(kLargeObjectSize);
EXPECT_EQ(small_object3 + kSmallObjectSize, large_object2);
// Delete the memory associated with the test.
free(reinterpret_cast<void*>(blob));
delete free_list;
}
} // namespace dart