| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "vm/virtual_memory.h" |
| |
| #include "platform/assert.h" |
| #include "platform/utils.h" |
| |
| namespace dart { |
| |
| 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()); |
| 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); |
| region_.Subregion(region_, 0, new_size); |
| } |
| |
| } // namespace dart |