Chromium Code Reviews| Index: Source/wtf/PageAllocator.cpp |
| diff --git a/Source/wtf/PageAllocator.cpp b/Source/wtf/PageAllocator.cpp |
| index 182a76ce2b99e1b5bf9e122ba1c2a134b9c9003d..fcf5360241401331babc407ff351b46c372e9ef0 100644 |
| --- a/Source/wtf/PageAllocator.cpp |
| +++ b/Source/wtf/PageAllocator.cpp |
| @@ -58,6 +58,28 @@ |
| namespace WTF { |
| +#if OS(WIN) |
| + |
| +static bool shouldUseAddressHint() |
| +{ |
| +#if !CPU(X86_64) |
| + // When running 32-bit processes under 32-bit Windows, the userspace is |
| + // limited to 2 GB, and we risk fragmenting it badly if we allow further |
| + // randomization via our address hint. On the other hand, if the process |
| + // is running under WOW64, then it has 3 GB available, and we want use the |
|
jschuh
2014/07/21 16:43:45
nit: Actually, it usually has 4GB available. I thi
|
| + // additional randomness. |
| + static BOOL bIsWow64 = -1; |
| + if (bIsWow64 == -1) { |
| + IsWow64Process(GetCurrentProcess(), &bIsWow64); |
| + } |
| + return !!bIsWow64; |
| +#else // !CPU(X86_64) |
| + return true; |
| +#endif // !CPU(X86_64) |
| +} |
| + |
| +#endif // OS(WIN) |
| + |
| // This simple internal function wraps the OS-specific page allocation call so |
| // that it behaves consistently: the address is a hint and if it cannot be used, |
| // the allocation will be placed elsewhere. |
| @@ -65,9 +87,10 @@ static void* systemAllocPages(void* addr, size_t len) |
| { |
| ASSERT(!(len & kPageAllocationGranularityOffsetMask)); |
| ASSERT(!(reinterpret_cast<uintptr_t>(addr) & kPageAllocationGranularityOffsetMask)); |
| - void* ret; |
| + void* ret = 0; |
| #if OS(WIN) |
| - ret = VirtualAlloc(addr, len, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); |
| + if (shouldUseAddressHint()) |
| + ret = VirtualAlloc(addr, len, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); |
| if (!ret) |
| ret = VirtualAlloc(0, len, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); |
| #else |