forked from OSchip/llvm-project
[SanitizerCommon] Reduce wasting memory in LowLevelAllocator.
MmapOrDie allocates memory multiple to page size. LowLevelAllocator should use all that memory for the internal buffer because there are chances that subsequent requests may be small enough to fit in that space. Differential Revision: https://reviews.llvm.org/D71275
This commit is contained in:
parent
f7235ac1d3
commit
3a713ae5fa
|
@ -213,7 +213,7 @@ void *LowLevelAllocator::Allocate(uptr size) {
|
|||
// Align allocation size.
|
||||
size = RoundUpTo(size, low_level_alloc_min_alignment);
|
||||
if (allocated_end_ - allocated_current_ < (sptr)size) {
|
||||
uptr size_to_allocate = Max(size, GetPageSizeCached());
|
||||
uptr size_to_allocate = RoundUpTo(size, GetPageSizeCached());
|
||||
allocated_current_ =
|
||||
(char*)MmapOrDie(size_to_allocate, __func__);
|
||||
allocated_end_ = allocated_current_ + size_to_allocate;
|
||||
|
|
|
@ -1404,4 +1404,15 @@ TEST(SanitizerCommon, ThreadedTwoLevelByteMap) {
|
|||
EXPECT_EQ((uptr)TestMapUnmapCallback::unmap_count, m.size1());
|
||||
}
|
||||
|
||||
TEST(SanitizerCommon, LowLevelAllocatorShouldRoundUpSizeOnAlloc) {
|
||||
// When allocating a memory block slightly bigger than a memory page and
|
||||
// LowLevelAllocator calls MmapOrDie for the internal buffer, it should round
|
||||
// the size up to the page size, so that subsequent calls to the allocator
|
||||
// can use the remaining space in the last allocated page.
|
||||
static LowLevelAllocator allocator;
|
||||
char *ptr1 = (char *)allocator.Allocate(GetPageSizeCached() + 16);
|
||||
char *ptr2 = (char *)allocator.Allocate(16);
|
||||
EXPECT_EQ(ptr2, ptr1 + GetPageSizeCached() + 16);
|
||||
}
|
||||
|
||||
#endif // #if !SANITIZER_DEBUG
|
||||
|
|
Loading…
Reference in New Issue