Index: runtime/vm/virtual_memory.cc |
=================================================================== |
--- runtime/vm/virtual_memory.cc (revision 41000) |
+++ runtime/vm/virtual_memory.cc (working copy) |
@@ -15,34 +15,15 @@ |
} |
-VirtualMemory* VirtualMemory::ReserveAligned(intptr_t size, |
- intptr_t alignment) { |
- ASSERT((size & (PageSize() - 1)) == 0); |
- ASSERT(Utils::IsPowerOfTwo(alignment)); |
- ASSERT(alignment >= PageSize()); |
- VirtualMemory* result = VirtualMemory::Reserve(size + alignment); |
- if (result == NULL) { |
- FATAL("Out of memory.\n"); |
- } |
- uword start = result->start(); |
- uword real_start = (start + alignment - 1) & ~(alignment - 1); |
- result->Truncate(real_start, size); |
- return result; |
-} |
- |
- |
-void VirtualMemory::Truncate(uword new_start, intptr_t new_size) { |
- ASSERT(new_start >= start()); |
+void VirtualMemory::Truncate(intptr_t new_size, bool try_unmap) { |
ASSERT((new_size & (PageSize() - 1)) == 0); |
- if (new_start > start()) { |
- uword split = new_start - start(); |
- ASSERT((split & (PageSize() - 1)) == 0); |
- FreeSubSegment(address(), split); |
- region_.Subregion(region_, split, size() - split); |
- } |
ASSERT(new_size <= size()); |
- FreeSubSegment(reinterpret_cast<void*>(start() + new_size), |
- size() - new_size); |
+ if (try_unmap && |
+ (reserved_size_ == size()) && /* Don't create holes in reservation. */ |
+ FreeSubSegment(reinterpret_cast<void*>(start() + new_size), |
+ size() - new_size)) { |
+ reserved_size_ = new_size; |
+ } |
region_.Subregion(region_, 0, new_size); |
} |