aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-09-08 00:02:17 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-09-08 00:02:17 +0000
commit070c61acf8bbff55d752a9e27efb283c01ec6914 (patch)
treef743c98449b69b0542a2d1447129162a376e4df5 /lib/Support
parentdec1dd194ecca30adfc1e5ba4313763c14338361 (diff)
downloadexternal_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.cpp22
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) {