Index: third_party/tcmalloc/chromium/src/system-alloc.cc |
diff --git a/third_party/tcmalloc/chromium/src/system-alloc.cc b/third_party/tcmalloc/chromium/src/system-alloc.cc |
index 690953d722a35ab27e2f211506f5975bb5b232e5..03fc9340ec9334e4d8eef20c4a653586d2e192c7 100644 |
--- a/third_party/tcmalloc/chromium/src/system-alloc.cc |
+++ b/third_party/tcmalloc/chromium/src/system-alloc.cc |
@@ -103,8 +103,7 @@ union MemoryAligner { |
static SpinLock spinlock(SpinLock::LINKER_INITIALIZED); |
-#if defined(HAVE_MMAP) || defined(MADV_DONTNEED) |
-// Page size is initialized on demand (only needed for mmap-based allocators) |
+#ifdef HAVE_GETPAGESIZE |
static size_t pagesize = 0; |
#endif |
@@ -160,6 +159,7 @@ class DefaultSysAllocator : public SysAllocator { |
for (int i = 0; i < kMaxAllocators; i++) { |
failed_[i] = true; |
allocs_[i] = NULL; |
+ names_[i] = NULL; |
} |
} |
void SetChildAllocator(SysAllocator* alloc, unsigned int index, |
@@ -167,6 +167,7 @@ class DefaultSysAllocator : public SysAllocator { |
if (index < kMaxAllocators && alloc != NULL) { |
allocs_[index] = alloc; |
failed_[index] = false; |
+ names_[index] = name; |
} |
} |
void* Alloc(size_t size, size_t *actual_size, size_t alignment); |
@@ -186,7 +187,6 @@ static const char mmap_name[] = "MmapSysAllocator"; |
void* SbrkSysAllocator::Alloc(size_t size, size_t *actual_size, |
size_t alignment) { |
#ifndef HAVE_SBRK |
- failed_ = true; |
return NULL; |
#else |
// Check if we should use sbrk allocation. |
@@ -201,7 +201,7 @@ void* SbrkSysAllocator::Alloc(size_t size, size_t *actual_size, |
// sbrk will release memory if passed a negative number, so we do |
// a strict check here |
- if (static_cast<ptrdiff_t>(size + alignment) < 0) return NULL; |
+ if (static_cast<std::ptrdiff_t>(size + alignment) < 0) return NULL; |
// This doesn't overflow because TCMalloc_SystemAlloc has already |
// tested for overflow at the alignment boundary. |
@@ -258,7 +258,6 @@ void* SbrkSysAllocator::Alloc(size_t size, size_t *actual_size, |
void* MmapSysAllocator::Alloc(size_t size, size_t *actual_size, |
size_t alignment) { |
#ifndef HAVE_MMAP |
- failed_ = true; |
return NULL; |
#else |
// Check if we should use mmap allocation. |
@@ -327,7 +326,6 @@ void* MmapSysAllocator::Alloc(size_t size, size_t *actual_size, |
void* DevMemSysAllocator::Alloc(size_t size, size_t *actual_size, |
size_t alignment) { |
#ifndef HAVE_MMAP |
- failed_ = true; |
return NULL; |
#else |
static bool initialized = false; |
@@ -485,6 +483,21 @@ void* TCMalloc_SystemAlloc(size_t size, size_t *actual_size, |
return result; |
} |
+size_t TCMalloc_SystemAddGuard(void* start, size_t size) { |
+#ifdef HAVE_GETPAGESIZE |
+ if (pagesize == 0) |
+ pagesize = getpagesize(); |
+ |
+ if (size < pagesize || (reinterpret_cast<size_t>(start) % pagesize) != 0) |
+ return 0; |
+ |
+ if (!mprotect(start, pagesize, PROT_NONE)) |
+ return pagesize; |
+#endif |
+ |
+ return 0; |
+} |
+ |
void TCMalloc_SystemRelease(void* start, size_t length) { |
#ifdef MADV_DONTNEED |
if (FLAGS_malloc_devmem_start) { |
@@ -520,3 +533,9 @@ void TCMalloc_SystemRelease(void* start, size_t length) { |
} |
#endif |
} |
+ |
+void TCMalloc_SystemCommit(void* start, size_t length) { |
+ // Nothing to do here. TCMalloc_SystemRelease does not alter pages |
+ // such that they need to be re-committed before they can be used by the |
+ // application. |
+} |