From 7dfda9e674c655d36147f074f4df9bef11f9c383 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Sat, 8 Sep 2007 00:02:17 +0000 Subject: [PATCH] Smarter Reset(). Instead of deallocating all memory regions and reallocate the first region, just deallocate all but the last region in the list. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41782 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Allocator.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/Support/Allocator.cpp b/lib/Support/Allocator.cpp index e68c3e26c7d..7c727b9435b 100644 --- a/lib/Support/Allocator.cpp +++ b/lib/Support/Allocator.cpp @@ -68,14 +68,25 @@ public: return NewRegion->Allocate(AllocSize, Alignment, RegPtr); } - /// Deallocate - Release all memory for this region to the system. - /// + /// Deallocate - Recursively release all memory for this and its next regions + /// to the system. void Deallocate() { MemRegion *next = Next; free(this); if (next) next->Deallocate(); } + + /// DeallocateAllButLast - Recursively release all memory for this and its + /// next regions to the system stopping at the last region in the list. + /// Returns the pointer to the last region. + MemRegion *DeallocateAllButLast() { + MemRegion *next = Next; + if (!next) + return this; + free(this); + return next->DeallocateAllButLast(); + } }; } @@ -93,9 +104,10 @@ BumpPtrAllocator::~BumpPtrAllocator() { } void BumpPtrAllocator::Reset() { - ((MemRegion*)TheMemory)->Deallocate(); - TheMemory = malloc(4096); - ((MemRegion*)TheMemory)->Init(4096, 1, 0); + MemRegion *MRP = (MemRegion*)TheMemory; + MRP = MRP->DeallocateAllButLast(); + MRP->Init(4096, 1, 0); + TheMemory = MRP; } void *BumpPtrAllocator::Allocate(unsigned Size, unsigned Align) {