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 03fc9340ec9334e4d8eef20c4a653586d2e192c7..ea718b3990f60531b267410d1b075aad4f3a190c 100644 |
--- a/third_party/tcmalloc/chromium/src/system-alloc.cc |
+++ b/third_party/tcmalloc/chromium/src/system-alloc.cc |
@@ -61,6 +61,13 @@ |
# define MAP_ANONYMOUS MAP_ANON |
#endif |
+// MADV_FREE is specifically designed for use by malloc(), but only |
+// FreeBSD supports it; in linux we fall back to the somewhat inferior |
+// MADV_DONTNEED. |
+#if !defined(MADV_FREE) && defined(MADV_DONTNEED) |
+# define MADV_FREE MADV_DONTNEED |
+#endif |
+ |
// Solaris has a bug where it doesn't declare madvise() for C++. |
// http://www.opensolaris.org/jive/thread.jspa?threadID=21035&tstart=0 |
#if defined(__sun) && defined(__SVR4) |
@@ -76,6 +83,10 @@ static const bool kDebugMode = false; |
static const bool kDebugMode = true; |
#endif |
+// TODO(sanjay): Move the code below into the tcmalloc namespace |
+using tcmalloc::kLog; |
+using tcmalloc::Log; |
+ |
// Anonymous namespace to avoid name conflicts on "CheckAddressBits". |
namespace { |
@@ -103,7 +114,8 @@ union MemoryAligner { |
static SpinLock spinlock(SpinLock::LINKER_INITIALIZED); |
-#ifdef HAVE_GETPAGESIZE |
+#if defined(HAVE_MMAP) || defined(MADV_FREE) |
+// Page size is initialized on demand (only needed for mmap-based allocators) |
static size_t pagesize = 0; |
#endif |
@@ -132,7 +144,6 @@ public: |
SbrkSysAllocator() : SysAllocator() { |
} |
void* Alloc(size_t size, size_t *actual_size, size_t alignment); |
- void FlagsInitialized() {} |
}; |
static char sbrk_space[sizeof(SbrkSysAllocator)]; |
@@ -141,7 +152,6 @@ public: |
MmapSysAllocator() : SysAllocator() { |
} |
void* Alloc(size_t size, size_t *actual_size, size_t alignment); |
- void FlagsInitialized() {} |
}; |
static char mmap_space[sizeof(MmapSysAllocator)]; |
@@ -150,7 +160,6 @@ public: |
DevMemSysAllocator() : SysAllocator() { |
} |
void* Alloc(size_t size, size_t *actual_size, size_t alignment); |
- void FlagsInitialized() {} |
}; |
class DefaultSysAllocator : public SysAllocator { |
@@ -171,7 +180,6 @@ class DefaultSysAllocator : public SysAllocator { |
} |
} |
void* Alloc(size_t size, size_t *actual_size, size_t alignment); |
- void FlagsInitialized() {} |
private: |
static const int kMaxAllocators = 2; |
@@ -187,6 +195,7 @@ 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 +210,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<std::ptrdiff_t>(size + alignment) < 0) return NULL; |
+ if (static_cast<ptrdiff_t>(size + alignment) < 0) return NULL; |
// This doesn't overflow because TCMalloc_SystemAlloc has already |
// tested for overflow at the alignment boundary. |
@@ -258,6 +267,7 @@ 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. |
@@ -326,6 +336,7 @@ 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; |
@@ -420,7 +431,6 @@ void* DefaultSysAllocator::Alloc(size_t size, size_t *actual_size, |
if (result != NULL) { |
return result; |
} |
- TCMalloc_MESSAGE(__FILE__, __LINE__, "%s failed.\n", names_[i]); |
failed_[i] = true; |
} |
} |
@@ -483,26 +493,11 @@ 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 |
+#ifdef MADV_FREE |
if (FLAGS_malloc_devmem_start) { |
- // It's not safe to use MADV_DONTNEED if we've been mapping |
- // /dev/mem for heap memory |
+ // It's not safe to use MADV_FREE/MADV_DONTNEED if we've been |
+ // mapping /dev/mem for heap memory. |
return; |
} |
if (pagesize == 0) pagesize = getpagesize(); |
@@ -526,16 +521,10 @@ void TCMalloc_SystemRelease(void* start, size_t length) { |
// Note -- ignoring most return codes, because if this fails it |
// doesn't matter... |
while (madvise(reinterpret_cast<char*>(new_start), new_end - new_start, |
- MADV_DONTNEED) == -1 && |
+ MADV_FREE) == -1 && |
errno == EAGAIN) { |
// NOP |
} |
} |
#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. |
-} |