| Index: third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.cpp
 | 
| diff --git a/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.cpp b/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.cpp
 | 
| index fec85c042be7c276827f6c5d325d415c302acc8c..b96fdb7ce7abd6ab2f7fa7d1838a65f20caae817 100644
 | 
| --- a/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.cpp
 | 
| +++ b/third_party/WebKit/Source/platform/PartitionAllocMemoryDumpProvider.cpp
 | 
| @@ -4,6 +4,11 @@
 | 
|  
 | 
|  #include "platform/PartitionAllocMemoryDumpProvider.h"
 | 
|  
 | 
| +#include "base/trace_event/heap_profiler_allocation_context.h"
 | 
| +#include "base/trace_event/heap_profiler_allocation_context_tracker.h"
 | 
| +#include "base/trace_event/heap_profiler_allocation_register.h"
 | 
| +#include "base/trace_event/process_memory_dump.h"
 | 
| +#include "base/trace_event/trace_event_memory_overhead.h"
 | 
|  #include "public/platform/WebMemoryAllocatorDump.h"
 | 
|  #include "public/platform/WebProcessMemoryDump.h"
 | 
|  #include "wtf/Partitions.h"
 | 
| @@ -15,6 +20,16 @@ namespace {
 | 
|  
 | 
|  using namespace WTF;
 | 
|  
 | 
| +void reportAllocation(void* address, size_t size, const char* typeName)
 | 
| +{
 | 
| +    PartitionAllocMemoryDumpProvider::instance()->insert(address, size, typeName);
 | 
| +}
 | 
| +
 | 
| +void reportFree(void* address)
 | 
| +{
 | 
| +    PartitionAllocMemoryDumpProvider::instance()->remove(address);
 | 
| +}
 | 
| +
 | 
|  const char kPartitionAllocDumpName[] = "partition_alloc";
 | 
|  const char kPartitionsDumpName[] = "partitions";
 | 
|  
 | 
| @@ -94,6 +109,19 @@ PartitionAllocMemoryDumpProvider* PartitionAllocMemoryDumpProvider::instance()
 | 
|  
 | 
|  bool PartitionAllocMemoryDumpProvider::onMemoryDump(WebMemoryDumpLevelOfDetail levelOfDetail, WebProcessMemoryDump* memoryDump)
 | 
|  {
 | 
| +    if (levelOfDetail == WebMemoryDumpLevelOfDetail::Detailed && m_isHeapProfilingEnabled) {
 | 
| +        base::trace_event::TraceEventMemoryOverhead overhead;
 | 
| +        base::hash_map<base::trace_event::AllocationContext, size_t> bytesByContext;
 | 
| +        {
 | 
| +            MutexLocker locker(m_allocationRegisterMutex);
 | 
| +            for (const auto& allocSize : *m_allocationRegister)
 | 
| +                bytesByContext[allocSize.context] += allocSize.size;
 | 
| +
 | 
| +            m_allocationRegister->EstimateTraceMemoryOverhead(&overhead);
 | 
| +        }
 | 
| +        memoryDump->dumpHeapUsage(bytesByContext, overhead, "partition_alloc");
 | 
| +    }
 | 
| +
 | 
|      PartitionStatsDumperImpl partitionStatsDumper(memoryDump, levelOfDetail);
 | 
|  
 | 
|      WebMemoryAllocatorDump* partitionsDump = memoryDump->createMemoryAllocatorDump(
 | 
| @@ -110,6 +138,8 @@ bool PartitionAllocMemoryDumpProvider::onMemoryDump(WebMemoryDumpLevelOfDetail l
 | 
|  }
 | 
|  
 | 
|  PartitionAllocMemoryDumpProvider::PartitionAllocMemoryDumpProvider()
 | 
| +    : m_allocationRegister(adoptPtr(new base::trace_event::AllocationRegister()))
 | 
| +    , m_isHeapProfilingEnabled(false)
 | 
|  {
 | 
|  }
 | 
|  
 | 
| @@ -117,12 +147,30 @@ PartitionAllocMemoryDumpProvider::~PartitionAllocMemoryDumpProvider()
 | 
|  {
 | 
|  }
 | 
|  
 | 
| -void PartitionAllocMemoryDumpProvider::onHeapProfilingEnabled(AllocationHook* allocationHook, FreeHook* freeHook)
 | 
| +void PartitionAllocMemoryDumpProvider::onHeapProfilingEnabled(bool enabled)
 | 
| +{
 | 
| +    if (enabled) {
 | 
| +        PartitionAllocHooks::setAllocationHook(reportAllocation);
 | 
| +        PartitionAllocHooks::setFreeHook(reportFree);
 | 
| +    } else {
 | 
| +        PartitionAllocHooks::setAllocationHook(nullptr);
 | 
| +        PartitionAllocHooks::setFreeHook(nullptr);
 | 
| +    }
 | 
| +    m_isHeapProfilingEnabled = enabled;
 | 
| +}
 | 
| +
 | 
| +void PartitionAllocMemoryDumpProvider::insert(void* address, size_t size, const char* typeName)
 | 
| +{
 | 
| +    base::trace_event::AllocationContext context = base::trace_event::AllocationContextTracker::GetContextSnapshot();
 | 
| +    context.type_name = typeName;
 | 
| +    MutexLocker locker(m_allocationRegisterMutex);
 | 
| +    m_allocationRegister->Insert(address, size, context);
 | 
| +}
 | 
| +
 | 
| +void PartitionAllocMemoryDumpProvider::remove(void* address)
 | 
|  {
 | 
| -    // Make PartitionAlloc call |allocationHook| and |freeHook| for every
 | 
| -    // subsequent allocation and free (or not if the pointers are null).
 | 
| -    PartitionAllocHooks::setAllocationHook(allocationHook);
 | 
| -    PartitionAllocHooks::setFreeHook(freeHook);
 | 
| +    MutexLocker locker(m_allocationRegisterMutex);
 | 
| +    m_allocationRegister->Remove(address);
 | 
|  }
 | 
|  
 | 
|  } // namespace blink
 | 
| 
 |