[Memory] Rename OS::ReleasePartialRegion to OS::Release.

- Change VirtualMemory to match OS memory concepts. Rename Release
  Free, ReleasePartial to Release.
- Adds comments to make the semantics clear. Right now V8 munmaps
  on POSIX, making address space available, while on Windows it is
  only possible to decommit.

Bug: chromium:756050
Change-Id: I6ba04d857ab9e1ca1f273e9e766e0825e67210cc
Reviewed-on: https://chromium-review.googlesource.com/783513
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Bill Budge <bbudge@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49586}
This commit is contained in:
Bill Budge 2017-11-21 13:05:47 -08:00 committed by Commit Bot
parent da0af28545
commit d59bf4dce1
11 changed files with 54 additions and 43 deletions

View File

@ -129,7 +129,7 @@ VirtualMemory::VirtualMemory(size_t size, void* hint, size_t alignment)
VirtualMemory::~VirtualMemory() {
if (IsReserved()) {
Release();
Free();
}
}
@ -147,8 +147,10 @@ bool VirtualMemory::SetPermissions(void* address, size_t size,
return result;
}
size_t VirtualMemory::ReleasePartial(void* free_start) {
size_t VirtualMemory::Release(void* free_start) {
DCHECK(IsReserved());
DCHECK(IsAddressAligned(static_cast<Address>(free_start),
base::OS::CommitPageSize()));
// Notice: Order is important here. The VirtualMemory object might live
// inside the allocated region.
const size_t free_size = size_ - (reinterpret_cast<size_t>(free_start) -
@ -161,14 +163,12 @@ size_t VirtualMemory::ReleasePartial(void* free_start) {
__lsan_unregister_root_region(address_, size_);
__lsan_register_root_region(address_, size_ - free_size);
#endif
const bool result = base::OS::ReleasePartialRegion(free_start, free_size);
USE(result);
DCHECK(result);
CHECK(base::OS::Release(free_start, free_size));
size_ -= free_size;
return free_size;
}
void VirtualMemory::Release() {
void VirtualMemory::Free() {
DCHECK(IsReserved());
// Notice: Order is important here. The VirtualMemory object might live
// inside the allocated region.

View File

@ -133,10 +133,11 @@ class V8_EXPORT_PRIVATE VirtualMemory {
bool SetPermissions(void* address, size_t size,
base::OS::MemoryPermission access);
// Releases the memory after |free_start|. Returns the bytes released.
size_t ReleasePartial(void* free_start);
// Releases memory after |free_start|. Returns the number of bytes released.
size_t Release(void* free_start);
void Release();
// Frees all memory.
void Free();
// Assign control of the reserved region to a different VirtualMemory object.
// The old object is no longer functional (IsReserved() returns false).

View File

@ -141,6 +141,13 @@ bool OS::Free(void* address, const size_t size) {
return VirtualFree(address, 0, MEM_RELEASE) != 0;
}
// static
bool OS::Release(void* address, size_t size) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
DCHECK_EQ(0, size % CommitPageSize());
return VirtualFree(address, size, MEM_DECOMMIT) != 0;
}
// static
bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
@ -152,11 +159,6 @@ bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
return VirtualAlloc(address, size, MEM_COMMIT, protect) != nullptr;
}
// static
bool OS::ReleasePartialRegion(void* address, size_t size) {
return VirtualFree(address, size, MEM_DECOMMIT) != 0;
}
// static
bool OS::HasLazyCommits() {
// TODO(alph): implement for the platform.

View File

@ -99,6 +99,14 @@ bool OS::Free(void* address, const size_t size) {
reinterpret_cast<uintptr_t>(address), size) == ZX_OK;
}
// static
bool OS::Release(void* address, size_t size) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
DCHECK_EQ(0, size % CommitPageSize());
return zx_vmar_unmap(zx_vmar_root_self(),
reinterpret_cast<uintptr_t>(address), size) == ZX_OK;
}
// static
bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
@ -109,12 +117,6 @@ bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
prot) == ZX_OK;
}
// static
bool OS::ReleasePartialRegion(void* address, size_t size) {
return zx_vmar_unmap(zx_vmar_root_self(),
reinterpret_cast<uintptr_t>(address), size) == ZX_OK;
}
// static
bool OS::HasLazyCommits() {
// TODO(scottmg): Port, https://crbug.com/731217.

View File

@ -275,6 +275,13 @@ bool OS::Free(void* address, const size_t size) {
return munmap(address, size) == 0;
}
// static
bool OS::Release(void* address, size_t size) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
DCHECK_EQ(0, size % CommitPageSize());
return munmap(address, size) == 0;
}
// static
bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
@ -283,11 +290,6 @@ bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
return mprotect(address, size, prot) == 0;
}
// static
bool OS::ReleasePartialRegion(void* address, size_t size) {
return munmap(address, size) == 0;
}
// static
bool OS::HasLazyCommits() {
#if V8_OS_AIX || V8_OS_LINUX || V8_OS_MACOSX

View File

@ -823,6 +823,13 @@ bool OS::Free(void* address, const size_t size) {
return VirtualFree(address, 0, MEM_RELEASE) != 0;
}
// static
bool OS::Release(void* address, size_t size) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
DCHECK_EQ(0, size % CommitPageSize());
return VirtualFree(address, size, MEM_DECOMMIT) != 0;
}
// static
bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
DCHECK_EQ(0, reinterpret_cast<uintptr_t>(address) % CommitPageSize());
@ -834,11 +841,6 @@ bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
return VirtualAlloc(address, size, MEM_COMMIT, protect) != nullptr;
}
// static
bool OS::ReleasePartialRegion(void* address, size_t size) {
return VirtualFree(address, size, MEM_DECOMMIT) != 0;
}
// static
bool OS::HasLazyCommits() {
// TODO(alph): implement for the platform.

View File

@ -187,15 +187,17 @@ class V8_BASE_EXPORT OS {
// multiples of AllocatePageSize(). Returns true on success, otherwise false.
V8_WARN_UNUSED_RESULT static bool Free(void* address, const size_t size);
// Releases memory that is no longer needed. The range specified by address
// and size must be part of an allocated memory region, and must be multiples
// of CommitPageSize(). Released memory is left in an undefined state, so it
// should not be accessed. Returns true on success, otherwise false.
V8_WARN_UNUSED_RESULT static bool Release(void* address, size_t size);
// Sets permissions according to the access argument. address and size must be
// multiples of CommitPageSize(). Returns true on success, otherwise false.
V8_WARN_UNUSED_RESULT static bool SetPermissions(void* address, size_t size,
MemoryPermission access);
// Release part of a reserved address range.
V8_WARN_UNUSED_RESULT static bool ReleasePartialRegion(void* address,
size_t size);
static bool HasLazyCommits();
// Sleep for a specified time interval.

View File

@ -305,7 +305,7 @@ void MemoryAllocator::TearDown() {
capacity_ = 0;
if (last_chunk_.IsReserved()) {
last_chunk_.Release();
last_chunk_.Free();
}
delete code_range_;
@ -434,7 +434,7 @@ void MemoryAllocator::FreeMemory(VirtualMemory* reservation,
DCHECK(executable == NOT_EXECUTABLE || !code_range()->valid() ||
reservation->size() <= Page::kPageSize);
reservation->Release();
reservation->Free();
}
@ -488,9 +488,9 @@ Address MemoryAllocator::AllocateAlignedMemory(
}
if (base == nullptr) {
// Failed to commit the body. Release the mapping and any partially
// committed regions inside it.
reservation.Release();
// Failed to commit the body. Free the mapping and any partially committed
// regions inside it.
reservation.Free();
size_.Decrement(reserve_size);
return nullptr;
}
@ -981,7 +981,7 @@ void MemoryAllocator::PartialFreeMemory(MemoryChunk* chunk, Address start_free,
// On e.g. Windows, a reservation may be larger than a page and releasing
// partially starting at |start_free| will also release the potentially
// unused part behind the current page.
const size_t released_bytes = reservation->ReleasePartial(start_free);
const size_t released_bytes = reservation->Release(start_free);
DCHECK_GE(size_.Value(), released_bytes);
size_.Decrement(released_bytes);
isolate_->counters()->memory_allocated()->Decrement(

View File

@ -1032,7 +1032,7 @@ class CodeRange {
public:
explicit CodeRange(Isolate* isolate);
~CodeRange() {
if (virtual_memory_.IsReserved()) virtual_memory_.Release();
if (virtual_memory_.IsReserved()) virtual_memory_.Free();
}
// Reserves a range of virtual memory, but does not commit any of it.

View File

@ -68,7 +68,7 @@ void StoreBuffer::SetUp() {
void StoreBuffer::TearDown() {
if (virtual_memory_.IsReserved()) virtual_memory_.Release();
if (virtual_memory_.IsReserved()) virtual_memory_.Free();
top_ = nullptr;
for (int i = 0; i < kStoreBuffers; i++) {
start_[i] = nullptr;

View File

@ -872,7 +872,7 @@ void WasmCodeManager::Free(VirtualMemory* mem) {
void* start = mem->address();
void* end = mem->end();
size_t size = mem->size();
mem->Release();
mem->Free();
TRACE_HEAP("VMem Release: %p:%p (%zu)\n", start, end, size);
}