| Index: third_party/tcmalloc/chromium/src/windows/port.cc
|
| diff --git a/third_party/tcmalloc/chromium/src/windows/port.cc b/third_party/tcmalloc/chromium/src/windows/port.cc
|
| index ec01fd60c9583a74249fe5faf459aca03995758e..e68de163d3ef91229ed305af8148d394710223d4 100644
|
| --- a/third_party/tcmalloc/chromium/src/windows/port.cc
|
| +++ b/third_party/tcmalloc/chromium/src/windows/port.cc
|
| @@ -61,7 +61,7 @@ int getpagesize() {
|
| return pagesize;
|
| }
|
|
|
| -extern "C" PERFTOOLS_DLL_DECL void* __sbrk(std::ptrdiff_t increment) {
|
| +extern "C" PERFTOOLS_DLL_DECL void* __sbrk(ptrdiff_t increment) {
|
| LOG(FATAL, "Windows doesn't implement sbrk!\n");
|
| return NULL;
|
| }
|
| @@ -149,13 +149,12 @@ static void NTAPI on_tls_callback(HINSTANCE h, DWORD dwReason, PVOID pv) {
|
|
|
| #ifdef _MSC_VER
|
|
|
| -// extern "C" suppresses C++ name mangling so we know the symbol names for the
|
| -// linker /INCLUDE:symbol pragmas above.
|
| +// extern "C" suppresses C++ name mangling so we know the symbol names
|
| +// for the linker /INCLUDE:symbol pragmas above.
|
| extern "C" {
|
| // This tells the linker to run these functions.
|
| #pragma data_seg(push, old_seg)
|
| - // Use CRT$XLY instead of CRT$XLB to ensure we're called LATER in sequence.
|
| -#pragma data_seg(".CRT$XLY")
|
| +#pragma data_seg(".CRT$XLB")
|
| void (NTAPI *p_thread_callback_tcmalloc)(
|
| HINSTANCE h, DWORD dwReason, PVOID pv) = on_tls_callback;
|
| #pragma data_seg(".CRT$XTU")
|
| @@ -219,10 +218,6 @@ extern "C" int perftools_pthread_once(pthread_once_t *once_control,
|
| // -----------------------------------------------------------------------
|
| // These functions replace system-alloc.cc
|
|
|
| -// The current system allocator. Because we don't link with system-alloc.cc,
|
| -// we need to define our own.
|
| -SysAllocator* sys_alloc = NULL;
|
| -
|
| // This is mostly like MmapSysAllocator::Alloc, except it does these weird
|
| // munmap's in the middle of the page, which is forbidden in windows.
|
| extern void* TCMalloc_SystemAlloc(size_t size, size_t *actual_size,
|
| @@ -232,102 +227,35 @@ extern void* TCMalloc_SystemAlloc(size_t size, size_t *actual_size,
|
| if (alignment < pagesize) alignment = pagesize;
|
| size = ((size + alignment - 1) / alignment) * alignment;
|
|
|
| - // Report the total number of bytes the OS actually delivered. This might be
|
| - // greater than |size| because of alignment concerns. The full size is
|
| - // necessary so that adjacent spans can be coalesced.
|
| - // TODO(antonm): proper processing of alignments
|
| - // in actual_size and decommitting.
|
| + // Safest is to make actual_size same as input-size.
|
| if (actual_size) {
|
| *actual_size = size;
|
| }
|
|
|
| - // 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);
|
| + // Ask for extra memory if alignment > pagesize
|
| + size_t extra = 0;
|
| + if (alignment > pagesize) {
|
| + extra = alignment - pagesize;
|
| + }
|
|
|
| - void* result = VirtualAlloc(0, size,
|
| + void* result = VirtualAlloc(0, size + extra,
|
| MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
|
| if (result == NULL)
|
| return NULL;
|
|
|
| - // 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);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -size_t TCMalloc_SystemAddGuard(void* start, size_t size) {
|
| - static size_t pagesize = 0;
|
| - if (pagesize == 0) {
|
| - SYSTEM_INFO system_info;
|
| - GetSystemInfo(&system_info);
|
| - pagesize = system_info.dwPageSize;
|
| - }
|
| -
|
| - // We know that TCMalloc_SystemAlloc will give us a correct page alignment
|
| - // regardless, so we can just assert to detect erroneous callers.
|
| - assert(reinterpret_cast<size_t>(start) % pagesize == 0);
|
| -
|
| - // Add a guard page to catch metadata corruption. We're using the
|
| - // PAGE_GUARD flag rather than NO_ACCESS because we want the unique
|
| - // exception in crash reports.
|
| - DWORD permissions = 0;
|
| - if (size > pagesize &&
|
| - VirtualProtect(start, pagesize, PAGE_READONLY | PAGE_GUARD,
|
| - &permissions)) {
|
| - return pagesize;
|
| + // 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));
|
| }
|
|
|
| - return 0;
|
| + ptr += adjust;
|
| + return reinterpret_cast<void*>(ptr);
|
| }
|
|
|
| void TCMalloc_SystemRelease(void* start, size_t length) {
|
| - if (VirtualFree(start, length, MEM_DECOMMIT))
|
| - return;
|
| -
|
| - // The decommit may fail if the memory region consists of allocations
|
| - // from more than one call to VirtualAlloc. In this case, fall back to
|
| - // using VirtualQuery to retrieve the allocation boundaries and decommit
|
| - // them each individually.
|
| -
|
| - char* ptr = static_cast<char*>(start);
|
| - char* end = ptr + length;
|
| - MEMORY_BASIC_INFORMATION info;
|
| - while (ptr < end) {
|
| - size_t resultSize = VirtualQuery(ptr, &info, sizeof(info));
|
| - assert(resultSize == sizeof(info));
|
| - size_t decommitSize = std::min<size_t>(info.RegionSize, end - ptr);
|
| - BOOL success = VirtualFree(ptr, decommitSize, MEM_DECOMMIT);
|
| - assert(success == TRUE);
|
| - ptr += decommitSize;
|
| - }
|
| -}
|
| -
|
| -void TCMalloc_SystemCommit(void* start, size_t length) {
|
| - if (VirtualAlloc(start, length, MEM_COMMIT, PAGE_READWRITE) == start)
|
| - return;
|
| -
|
| - // The commit may fail if the memory region consists of allocations
|
| - // from more than one call to VirtualAlloc. In this case, fall back to
|
| - // using VirtualQuery to retrieve the allocation boundaries and commit them
|
| - // each individually.
|
| -
|
| - char* ptr = static_cast<char*>(start);
|
| - char* end = ptr + length;
|
| - MEMORY_BASIC_INFORMATION info;
|
| - while (ptr < end) {
|
| - size_t resultSize = VirtualQuery(ptr, &info, sizeof(info));
|
| - assert(resultSize == sizeof(info));
|
| -
|
| - size_t commitSize = std::min<size_t>(info.RegionSize, end - ptr);
|
| - void* newAddress = VirtualAlloc(ptr, commitSize, MEM_COMMIT,
|
| - PAGE_READWRITE);
|
| - assert(newAddress == ptr);
|
| - ptr += commitSize;
|
| - }
|
| + // TODO(csilvers): should I be calling VirtualFree here?
|
| }
|
|
|
| bool RegisterSystemAllocator(SysAllocator *allocator, int priority) {
|
| @@ -338,6 +266,9 @@ void DumpSystemAllocatorStats(TCMalloc_Printer* printer) {
|
| // We don't dump stats on windows, right now
|
| }
|
|
|
| +// The current system allocator
|
| +SysAllocator* sys_alloc = NULL;
|
| +
|
|
|
| // -----------------------------------------------------------------------
|
| // These functions rework existing functions of the same name in the
|
|
|