mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
BumpPtrAllocator: Make sure threshold cannot be initialized with a value smaller than the slab size.
This replaces r151834 with a simpler fix. llvm-svn: 151842
This commit is contained in:
parent
5bca3bef43
commit
88e1073516
@ -22,8 +22,8 @@ namespace llvm {
|
||||
|
||||
BumpPtrAllocator::BumpPtrAllocator(size_t size, size_t threshold,
|
||||
SlabAllocator &allocator)
|
||||
: SlabSize(size), SizeThreshold(threshold), Allocator(allocator),
|
||||
CurSlab(0), BytesAllocated(0) { }
|
||||
: SlabSize(size), SizeThreshold(std::min(size, threshold)),
|
||||
Allocator(allocator), CurSlab(0), BytesAllocated(0) { }
|
||||
|
||||
BumpPtrAllocator::~BumpPtrAllocator() {
|
||||
DeallocateSlabs(CurSlab);
|
||||
@ -87,21 +87,15 @@ void BumpPtrAllocator::Reset() {
|
||||
/// Allocate - Allocate space at the specified 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.
|
||||
StartNewSlab();
|
||||
|
||||
// Keep track of how many bytes we've allocated.
|
||||
BytesAllocated += Size;
|
||||
|
||||
// 0-byte alignment means 1-byte alignment.
|
||||
if (Alignment == 0) Alignment = 1;
|
||||
|
||||
// Allocate the aligned space, going forwards from CurPtr.
|
||||
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.
|
||||
size_t PaddedSize = Size + sizeof(MemSlab) + Alignment - 1;
|
||||
if (PaddedSize > SizeThreshold) {
|
||||
MemSlab *NewSlab = Allocator.Allocate(PaddedSize);
|
||||
|
||||
|
@ -98,7 +98,7 @@ TEST(AllocatorTest, TestSmallSlabSize) {
|
||||
BumpPtrAllocator Alloc(128);
|
||||
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user