diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-09-08 00:02:17 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-09-08 00:02:17 +0000 |
commit | 070c61acf8bbff55d752a9e27efb283c01ec6914 (patch) | |
tree | f743c98449b69b0542a2d1447129162a376e4df5 /lib/Support | |
parent | dec1dd194ecca30adfc1e5ba4313763c14338361 (diff) | |
download | external_llvm-070c61acf8bbff55d752a9e27efb283c01ec6914.zip external_llvm-070c61acf8bbff55d752a9e27efb283c01ec6914.tar.gz external_llvm-070c61acf8bbff55d752a9e27efb283c01ec6914.tar.bz2 |
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
Diffstat (limited to 'lib/Support')
-rw-r--r-- | lib/Support/Allocator.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/Support/Allocator.cpp b/lib/Support/Allocator.cpp index e68c3e2..7c727b9 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) { |