Chromium Code Reviews| Index: Source/platform/heap/Heap.cpp |
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
| index d775343e9681faf8f23c2f66261482d130fad816..cede24d47dee3b249f1da904a13db81b972aa326 100644 |
| --- a/Source/platform/heap/Heap.cpp |
| +++ b/Source/platform/heap/Heap.cpp |
| @@ -37,9 +37,9 @@ |
| #include "platform/heap/CallbackStack.h" |
| #include "platform/heap/ThreadState.h" |
| #include "public/platform/Platform.h" |
| -#include "wtf/AddressSpaceRandomization.h" |
| #include "wtf/Assertions.h" |
| #include "wtf/LeakAnnotations.h" |
| +#include "wtf/PageAllocator.h" |
| #include "wtf/PassOwnPtr.h" |
| #if ENABLE(GC_PROFILE_MARKING) |
| #include "wtf/HashMap.h" |
| @@ -85,11 +85,6 @@ static bool IsPowerOf2(size_t power) |
| } |
| #endif |
| -static Address roundToBlinkPageBoundary(void* base) |
| -{ |
| - return reinterpret_cast<Address>((reinterpret_cast<uintptr_t>(base) + blinkPageOffsetMask) & blinkPageBaseMask); |
| -} |
| - |
| static size_t roundToOsPageSize(size_t size) |
| { |
| return (size + osPageSize() - 1) & ~(osPageSize() - 1); |
| @@ -132,13 +127,7 @@ public: |
| void release() |
| { |
| -#if OS(POSIX) |
| - int err = munmap(m_base, m_size); |
| - RELEASE_ASSERT(!err); |
| -#else |
| - bool success = VirtualFree(m_base, 0, MEM_RELEASE); |
| - RELEASE_ASSERT(success); |
| -#endif |
| + WTF::freePages(m_base, m_size); |
| } |
| WARN_UNUSED_RETURN bool commit() |
| @@ -247,87 +236,12 @@ private: |
| static PageMemoryRegion* allocate(size_t size, unsigned numPages) |
| { |
| - // Compute a random blink page aligned address for the page memory |
| - // region and attempt to get the memory there. |
| - Address randomAddress = reinterpret_cast<Address>(WTF::getRandomPageBase()); |
| - Address alignedRandomAddress = roundToBlinkPageBoundary(randomAddress); |
| - |
| -#if OS(POSIX) |
| - Address base = static_cast<Address>(mmap(alignedRandomAddress, size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0)); |
| - if (base == roundToBlinkPageBoundary(base)) |
| - return new PageMemoryRegion(base, size, numPages); |
| - |
| - // We failed to get a blink page aligned chunk of memory. |
| - // Unmap the chunk that we got and fall back to overallocating |
| - // and selecting an aligned sub part of what we allocate. |
| - if (base != MAP_FAILED) { |
| - int error = munmap(base, size); |
| - RELEASE_ASSERT(!error); |
| - } |
| - size_t allocationSize = size + blinkPageSize; |
| - for (int attempt = 0; attempt < 10; attempt++) { |
| - base = static_cast<Address>(mmap(alignedRandomAddress, allocationSize, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0)); |
| - if (base != MAP_FAILED) |
| - break; |
| - randomAddress = reinterpret_cast<Address>(WTF::getRandomPageBase()); |
| - alignedRandomAddress = roundToBlinkPageBoundary(randomAddress); |
| - } |
| - RELEASE_ASSERT(base != MAP_FAILED); |
| - |
| - Address end = base + allocationSize; |
| - Address alignedBase = roundToBlinkPageBoundary(base); |
| - Address regionEnd = alignedBase + size; |
| - |
| - // If the allocated memory was not blink page aligned release |
| - // the memory before the aligned address. |
| - if (alignedBase != base) |
| - MemoryRegion(base, alignedBase - base).release(); |
| - |
| - // Free the additional memory at the end of the page if any. |
| - if (regionEnd < end) |
| - MemoryRegion(regionEnd, end - regionEnd).release(); |
| - |
| - return new PageMemoryRegion(alignedBase, size, numPages); |
| -#else |
| - Address base = static_cast<Address>(VirtualAlloc(alignedRandomAddress, size, MEM_RESERVE, PAGE_NOACCESS)); |
| - if (base) { |
| - ASSERT(base == alignedRandomAddress); |
| - return new PageMemoryRegion(base, size, numPages); |
| - } |
| - |
| - // We failed to get the random aligned address that we asked |
| - // for. Fall back to overallocating. On Windows it is |
| - // impossible to partially release a region of memory |
| - // allocated by VirtualAlloc. To avoid wasting virtual address |
| - // space we attempt to release a large region of memory |
| - // returned as a whole and then allocate an aligned region |
| - // inside this larger region. |
| - size_t allocationSize = size + blinkPageSize; |
| - for (int attempt = 0; attempt < 3; attempt++) { |
| - base = static_cast<Address>(VirtualAlloc(0, allocationSize, MEM_RESERVE, PAGE_NOACCESS)); |
| - RELEASE_ASSERT(base); |
| - VirtualFree(base, 0, MEM_RELEASE); |
| - |
| - Address alignedBase = roundToBlinkPageBoundary(base); |
| - base = static_cast<Address>(VirtualAlloc(alignedBase, size, MEM_RESERVE, PAGE_NOACCESS)); |
| - if (base) { |
| - ASSERT(base == alignedBase); |
| - return new PageMemoryRegion(alignedBase, size, numPages); |
| - } |
| - } |
| - |
| - // We failed to avoid wasting virtual address space after |
| - // several attempts. |
| - base = static_cast<Address>(VirtualAlloc(0, allocationSize, MEM_RESERVE, PAGE_NOACCESS)); |
| + // Round size up to the allocation granularity. |
| + size = (size + WTF::kPageAllocationGranularityOffsetMask) & WTF::kPageAllocationGranularityBaseMask; |
| + Address base = static_cast<Address>(WTF::allocPages(nullptr, size, blinkPageSize)); |
| RELEASE_ASSERT(base); |
| - |
| - // FIXME: If base is by accident blink page size aligned |
| - // here then we can create two pages out of reserved |
| - // space. Do this. |
| - Address alignedBase = roundToBlinkPageBoundary(base); |
| - |
| - return new PageMemoryRegion(alignedBase, size, numPages); |
| -#endif |
| + WTF::setSystemPagesInaccessible(base, size); |
|
Jens Widell
2014/11/17 10:20:07
I realized the old code here actually allocated in
|
| + return new PageMemoryRegion(base, size, numPages); |
| } |
| bool m_isLargePage; |