Commit 80781b03 authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

[heap/platform] Release unused over reserved memory

Affects the Windows case where we over reserve for alignment reasons but
actually already get aligned memory.

Implemented on allocator level to potentially cover other platforms as
well.

Bug: 
Change-Id: I4859451f157e1e363db27413a43345fdd1990a06
Reviewed-on: https://chromium-review.googlesource.com/535454
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#45970}
parent 0fa79982
......@@ -188,10 +188,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() { return address_ != NULL; }
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -196,12 +196,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() {
return address_ != NULL;
}
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -161,12 +161,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() {
return address_ != NULL;
}
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -45,8 +45,6 @@ VirtualMemory::VirtualMemory(size_t size, size_t alignment)
VirtualMemory::~VirtualMemory() {}
bool VirtualMemory::IsReserved() { return false; }
void VirtualMemory::Reset() {}
bool VirtualMemory::Commit(void* address, size_t size, bool is_executable) {
......
......@@ -244,8 +244,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() { return address_ != NULL; }
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -154,12 +154,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() {
return address_ != NULL;
}
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -192,12 +192,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() {
return address_ != NULL;
}
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -218,12 +218,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() {
return address_ != NULL;
}
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -139,12 +139,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() {
return address_ != NULL;
}
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -1253,12 +1253,6 @@ VirtualMemory::~VirtualMemory() {
}
}
bool VirtualMemory::IsReserved() {
return address_ != NULL;
}
void VirtualMemory::Reset() {
address_ = NULL;
size_ = 0;
......
......@@ -313,7 +313,7 @@ class V8_BASE_EXPORT VirtualMemory {
~VirtualMemory();
// Returns whether the memory has been reserved.
bool IsReserved();
bool IsReserved() const { return address_ != nullptr; }
// Initialize or resets an embedded VirtualMemory object.
void Reset();
......@@ -322,16 +322,22 @@ class V8_BASE_EXPORT VirtualMemory {
// If the memory was reserved with an alignment, this address is not
// necessarily aligned. The user might need to round it up to a multiple of
// the alignment to get the start of the aligned block.
void* address() {
void* address() const {
DCHECK(IsReserved());
return address_;
}
void* end() const {
DCHECK(IsReserved());
return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(address_) +
size_);
}
// Returns the size of the reserved memory. The returned value is only
// meaningful when IsReserved() returns true.
// If the memory was reserved with an alignment, this size may be larger
// than the requested size.
size_t size() { return size_; }
size_t size() const { return size_; }
// Commits real memory. Returns whether the operation succeeded.
bool Commit(void* address, size_t size, bool is_executable);
......
......@@ -463,10 +463,14 @@ Address MemoryAllocator::ReserveAlignedMemory(size_t size, size_t alignment,
base::VirtualMemory* controller) {
base::VirtualMemory reservation(size, alignment);
if (!reservation.IsReserved()) return NULL;
size_.Increment(reservation.size());
Address base =
if (!reservation.IsReserved()) return nullptr;
const Address base =
RoundUp(static_cast<Address>(reservation.address()), alignment);
if (base + size != reservation.end()) {
const Address unused_start = RoundUp(base + size, GetCommitPageSize());
reservation.ReleasePartial(unused_start);
}
size_.Increment(reservation.size());
controller->TakeControl(&reservation);
return base;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment