| Index: third_party/tcmalloc/chromium/src/heap-profile-table.cc
 | 
| diff --git a/third_party/tcmalloc/chromium/src/heap-profile-table.cc b/third_party/tcmalloc/chromium/src/heap-profile-table.cc
 | 
| index 1ef18586e4d050e6e0d1ded2b5ca2df256c058be..696f41e0b9cedbbaf36f43fd71e36605eb0e8117 100644
 | 
| --- a/third_party/tcmalloc/chromium/src/heap-profile-table.cc
 | 
| +++ b/third_party/tcmalloc/chromium/src/heap-profile-table.cc
 | 
| @@ -123,7 +123,12 @@ static bool ByAllocatedSpace(HeapProfileTable::Stats* a,
 | 
|  //----------------------------------------------------------------------
 | 
|  
 | 
|  HeapProfileTable::HeapProfileTable(Allocator alloc, DeAllocator dealloc)
 | 
| -    : alloc_(alloc), dealloc_(dealloc) {
 | 
| +    : alloc_(alloc),
 | 
| +      dealloc_(dealloc),
 | 
| +      num_alloc_buckets_(0),
 | 
| +      mmap_table_(NULL),
 | 
| +      num_available_mmap_buckets_(0),
 | 
| +      mmap_address_map_(NULL) {
 | 
|    // Initialize the overall profile stats.
 | 
|    memset(&total_, 0, sizeof(total_));
 | 
|  
 | 
| @@ -131,16 +136,10 @@ HeapProfileTable::HeapProfileTable(Allocator alloc, DeAllocator dealloc)
 | 
|    const int alloc_table_bytes = kHashTableSize * sizeof(*alloc_table_);
 | 
|    alloc_table_ = reinterpret_cast<Bucket**>(alloc_(alloc_table_bytes));
 | 
|    memset(alloc_table_, 0, alloc_table_bytes);
 | 
| -  num_alloc_buckets_ = 0;
 | 
| -
 | 
| -  // Initialize the mmap table.
 | 
| -  mmap_table_ = NULL;
 | 
| -  num_available_mmap_buckets_ = 0;
 | 
|  
 | 
|    // Make malloc and mmap allocation maps.
 | 
|    alloc_address_map_ =
 | 
|        new(alloc_(sizeof(AllocationMap))) AllocationMap(alloc_, dealloc_);
 | 
| -  mmap_address_map_ = NULL;
 | 
|  }
 | 
|  
 | 
|  HeapProfileTable::~HeapProfileTable() {
 | 
| @@ -355,7 +354,8 @@ HeapProfileTable::MakeSortedBucketList() const {
 | 
|    return list;
 | 
|  }
 | 
|  
 | 
| -void HeapProfileTable::RefreshMMapData() {
 | 
| +void HeapProfileTable::RefreshMMapData(Allocator mmap_alloc,
 | 
| +                                       DeAllocator mmap_dealloc) {
 | 
|    // Make the table
 | 
|    static const int mmap_table_bytes = kHashTableSize * sizeof(*mmap_table_);
 | 
|    if (mmap_table_ == NULL) {
 | 
| @@ -365,8 +365,8 @@ void HeapProfileTable::RefreshMMapData() {
 | 
|    num_available_mmap_buckets_ = 0;
 | 
|  
 | 
|    ClearMMapData();
 | 
| -  mmap_address_map_ =
 | 
| -      new(alloc_(sizeof(AllocationMap))) AllocationMap(alloc_, dealloc_);
 | 
| +  mmap_address_map_ = new(alloc_(sizeof(AllocationMap)))
 | 
| +      AllocationMap(mmap_alloc, mmap_dealloc);
 | 
|  
 | 
|    MemoryRegionMap::LockHolder l;
 | 
|    for (MemoryRegionMap::RegionIterator r =
 | 
| @@ -388,12 +388,12 @@ void HeapProfileTable::RefreshMMapData() {
 | 
|  }
 | 
|  
 | 
|  void HeapProfileTable::ClearMMapData() {
 | 
| -  if (mmap_address_map_ != NULL) {
 | 
| -    mmap_address_map_->Iterate(ZeroBucketCountsIterator, this);
 | 
| -    mmap_address_map_->~AllocationMap();
 | 
| -    dealloc_(mmap_address_map_);
 | 
| -    mmap_address_map_ = NULL;
 | 
| -  }
 | 
| +  if (mmap_address_map_ == NULL) return;
 | 
| +
 | 
| +  mmap_address_map_->Iterate(ZeroBucketCountsIterator, this);
 | 
| +  mmap_address_map_->~AllocationMap();
 | 
| +  dealloc_(mmap_address_map_);
 | 
| +  mmap_address_map_ = NULL;
 | 
|  }
 | 
|  
 | 
|  void HeapProfileTable::IterateOrderedAllocContexts(
 | 
| @@ -505,22 +505,21 @@ bool HeapProfileTable::WriteProfile(const char* file_name,
 | 
|                                      AllocationMap* allocations) {
 | 
|    RAW_VLOG(1, "Dumping non-live heap profile to %s", file_name);
 | 
|    RawFD fd = RawOpenForWriting(file_name);
 | 
| -  if (fd != kIllegalRawFD) {
 | 
| -    RawWrite(fd, kProfileHeader, strlen(kProfileHeader));
 | 
| -    char buf[512];
 | 
| -    int len = UnparseBucket(total, buf, 0, sizeof(buf), " heapprofile",
 | 
| -                            NULL);
 | 
| -    RawWrite(fd, buf, len);
 | 
| -    const DumpArgs args(fd, NULL);
 | 
| -    allocations->Iterate<const DumpArgs&>(DumpNonLiveIterator, args);
 | 
| -    RawWrite(fd, kProcSelfMapsHeader, strlen(kProcSelfMapsHeader));
 | 
| -    DumpProcSelfMaps(fd);
 | 
| -    RawClose(fd);
 | 
| -    return true;
 | 
| -  } else {
 | 
| +  if (fd == kIllegalRawFD) {
 | 
|      RAW_LOG(ERROR, "Failed dumping filtered heap profile to %s", file_name);
 | 
|      return false;
 | 
|    }
 | 
| +  RawWrite(fd, kProfileHeader, strlen(kProfileHeader));
 | 
| +  char buf[512];
 | 
| +  int len = UnparseBucket(total, buf, 0, sizeof(buf), " heapprofile",
 | 
| +                          NULL);
 | 
| +  RawWrite(fd, buf, len);
 | 
| +  const DumpArgs args(fd, NULL);
 | 
| +  allocations->Iterate<const DumpArgs&>(DumpNonLiveIterator, args);
 | 
| +  RawWrite(fd, kProcSelfMapsHeader, strlen(kProcSelfMapsHeader));
 | 
| +  DumpProcSelfMaps(fd);
 | 
| +  RawClose(fd);
 | 
| +  return true;
 | 
|  }
 | 
|  
 | 
|  void HeapProfileTable::CleanupOldProfiles(const char* prefix) {
 | 
| 
 |