BumpPtrAllocator: Make sure threshold cannot be initialized with a value smaller than the slab size.

This replaces r151834 with a simpler fix.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151842 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2012-03-01 22:10:16 +00:00
parent b4d023503b
commit 97e910ecff
2 changed files with 7 additions and 12 deletions

View File

@ -22,8 +22,8 @@ namespace llvm {
BumpPtrAllocator::BumpPtrAllocator(size_t size, size_t threshold, BumpPtrAllocator::BumpPtrAllocator(size_t size, size_t threshold,
SlabAllocator &allocator) SlabAllocator &allocator)
: SlabSize(size), SizeThreshold(threshold), Allocator(allocator), : SlabSize(size), SizeThreshold(std::min(size, threshold)),
CurSlab(0), BytesAllocated(0) { } Allocator(allocator), CurSlab(0), BytesAllocated(0) { }
BumpPtrAllocator::~BumpPtrAllocator() { BumpPtrAllocator::~BumpPtrAllocator() {
DeallocateSlabs(CurSlab); DeallocateSlabs(CurSlab);
@ -87,21 +87,15 @@ void BumpPtrAllocator::Reset() {
/// Allocate - Allocate space at the specified alignment. /// Allocate - Allocate space at the specified alignment.
/// ///
void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) { void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) {
// 0-byte alignment means 1-byte alignment.
if (Alignment == 0) Alignment = 1;
size_t PaddedSize = Size + sizeof(MemSlab) + Alignment - 1;
// If requested size exceeds slab size, increase slab size.
while (PaddedSize > SlabSize)
SlabSize *= 2;
if (!CurSlab) // Start a new slab if we haven't allocated one already. if (!CurSlab) // Start a new slab if we haven't allocated one already.
StartNewSlab(); StartNewSlab();
// Keep track of how many bytes we've allocated. // Keep track of how many bytes we've allocated.
BytesAllocated += Size; BytesAllocated += Size;
// 0-byte alignment means 1-byte alignment.
if (Alignment == 0) Alignment = 1;
// Allocate the aligned space, going forwards from CurPtr. // Allocate the aligned space, going forwards from CurPtr.
char *Ptr = AlignPtr(CurPtr, Alignment); char *Ptr = AlignPtr(CurPtr, Alignment);
@ -112,6 +106,7 @@ void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) {
} }
// If Size is really big, allocate a separate slab for it. // If Size is really big, allocate a separate slab for it.
size_t PaddedSize = Size + sizeof(MemSlab) + Alignment - 1;
if (PaddedSize > SizeThreshold) { if (PaddedSize > SizeThreshold) {
MemSlab *NewSlab = Allocator.Allocate(PaddedSize); MemSlab *NewSlab = Allocator.Allocate(PaddedSize);

View File

@ -98,7 +98,7 @@ TEST(AllocatorTest, TestSmallSlabSize) {
BumpPtrAllocator Alloc(128); BumpPtrAllocator Alloc(128);
Alloc.Allocate(200, 0); Alloc.Allocate(200, 0);
EXPECT_EQ(1U, Alloc.GetNumSlabs()); EXPECT_EQ(2U, Alloc.GetNumSlabs());
} }
// Mock slab allocator that returns slabs aligned on 4096 bytes. There is no // Mock slab allocator that returns slabs aligned on 4096 bytes. There is no