mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
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:
parent
b4d023503b
commit
97e910ecff
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user