Chromium Code Reviews| 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 b755b3fdc9bb3e0d34e644b03b7e16582a3aa61a..fc832d84825f4278bb13bb1e8007d895b490514d 100644 |
| --- a/third_party/tcmalloc/chromium/src/system-alloc.cc |
| +++ b/third_party/tcmalloc/chromium/src/system-alloc.cc |
| @@ -47,6 +47,7 @@ |
| #ifdef HAVE_UNISTD_H |
| #include <unistd.h> // for sbrk, getpagesize, off_t |
| #endif |
| +#include <limits> |
| #include <new> // for operator new |
| #include <gperftools/malloc_extension.h> |
| #include "base/basictypes.h" |
| @@ -208,6 +209,10 @@ void* SbrkSysAllocator::Alloc(size_t size, size_t *actual_size, |
| return NULL; |
| } |
| + // The first time we call into the allocator, record the current pointer |
| + // to the break. This will be used to calculate the total size. |
| + static const char* initial_brk_address = static_cast<char*>(sbrk(0)); |
| + |
| // 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; |
| @@ -229,10 +234,20 @@ void* SbrkSysAllocator::Alloc(size_t size, size_t *actual_size, |
| // http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/sys/sbrk.c?a=true |
| // http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/libc/misc/sbrk.c?rev=1.1.2.1&content-type=text/plain&cvsroot=glibc |
| // Without this check, sbrk may succeed when it ought to fail.) |
| - if (reinterpret_cast<intptr_t>(sbrk(0)) + size < size) { |
| + const char* current_brk_address = static_cast<char*>(sbrk(0)); |
| + if (reinterpret_cast<intptr_t>(current_brk_address) + size < size) { |
|
Chris Evans
2013/01/11 19:51:51
Ooh... this was here before, but intptr_t is a sig
|
| return NULL; |
| } |
| + ASSERT(current_brk_address >= initial_brk_address); |
| + const size_t current_alloc_size = |
| + static_cast<size_t>(current_brk_address - initial_brk_address); |
| + ASSERT(current_alloc_size <= |
| + std::numeric_limits<std::size_t>::max() - size); |
| + |
| + if (!tcmalloc::IsContiguousAllocSizePermitted(current_alloc_size + size)) |
| + return NULL; |
|
Chris Evans
2013/01/11 19:51:51
This seems like a very low-level way to accomplish
jln (very slow on Chromium)
2013/01/11 20:02:04
The change to GrowHeap should take care of that in
|
| + |
| void* result = sbrk(size); |
| if (result == reinterpret_cast<void*>(-1)) { |
| return NULL; |