Chromium Code Reviews| Index: third_party/tcmalloc/port.cc |
| diff --git a/third_party/tcmalloc/port.cc b/third_party/tcmalloc/port.cc |
| index 578c8bac4eb63e3306379eb7e83cc20de34730cd..5c9cad5f3354356632fecc4a3bab7e1d488b65ca 100644 |
| --- a/third_party/tcmalloc/port.cc |
| +++ b/third_party/tcmalloc/port.cc |
| @@ -71,7 +71,8 @@ int getpagesize() { |
| if (pagesize == 0) { |
| SYSTEM_INFO system_info; |
| GetSystemInfo(&system_info); |
| - pagesize = system_info.dwPageSize; |
| + pagesize = std::max(system_info.dwPageSize, |
| + system_info.dwAllocationGranularity); |
| } |
| return pagesize; |
| } |
| @@ -188,37 +189,35 @@ static SpinLock alloc_lock(SpinLock::LINKER_INITIALIZED); |
| // munmap's in the middle of the page, which is forbidden in windows. |
| extern void* TCMalloc_SystemAlloc(size_t size, size_t *actual_size, |
| size_t alignment) { |
| - // Safest is to make actual_size same as input-size. |
| - if (actual_size) { |
| - *actual_size = size; |
| - } |
| - |
| SpinLockHolder sh(&alloc_lock); |
| // Align on the pagesize boundary |
| const int pagesize = getpagesize(); |
| if (alignment < pagesize) alignment = pagesize; |
| size = ((size + alignment - 1) / alignment) * alignment; |
| - // Ask for extra memory if alignment > pagesize |
| - size_t extra = 0; |
| - if (alignment > pagesize) { |
| - extra = alignment - pagesize; |
| + // Safest is to make actual_size same as input-size. |
|
jar (doing other things)
2009/09/24 23:24:34
The unexplained "safest" comment could be elaborat
|
| + // TODO(antonm): proper processing of alignments |
| + // in actual_size and decommitting. |
|
jar (doing other things)
2009/09/24 23:24:34
I don't understand this TODO comment. Can you cla
|
| + if (actual_size) { |
| + *actual_size = size; |
| } |
| - void* result = VirtualAlloc(0, size + extra, |
| + // We currently do not support alignments larger than the pagesize or |
| + // alignments that are not multiples of the pagesize after being floored. |
| + // If this ability is needed it can be done by the caller (assuming it knows |
| + // the page size). |
| + assert(alignment <= pagesize); |
| + |
| + void* result = VirtualAlloc(0, size, |
| MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); |
| if (result == NULL) |
| return NULL; |
| - // Adjust the return memory so it is aligned |
| - uintptr_t ptr = reinterpret_cast<uintptr_t>(result); |
| - size_t adjust = 0; |
| - if ((ptr & (alignment - 1)) != 0) { |
| - adjust = alignment - (ptr & (alignment - 1)); |
| - } |
| + // If the result is not aligned memory fragmentation will result which can |
| + // lead to pathological memory use. |
| + assert((reinterpret_cast<uintptr_t>(result) & (alignment - 1)) == 0); |
| - ptr += adjust; |
| - return reinterpret_cast<void*>(ptr); |
| + return result; |
| } |
| void TCMalloc_SystemRelease(void* start, size_t length) { |