| Index: content/browser/renderer_host/render_process_host_impl.cc
 | 
| diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
 | 
| index 011104d99fc99bac4b3e86e9c48c70729a0b81cb..c6c9d15c2d347473b7ce53a993fb7e7028706fdd 100644
 | 
| --- a/content/browser/renderer_host/render_process_host_impl.cc
 | 
| +++ b/content/browser/renderer_host/render_process_host_impl.cc
 | 
| @@ -24,8 +24,12 @@
 | 
|  #include "base/location.h"
 | 
|  #include "base/logging.h"
 | 
|  #include "base/macros.h"
 | 
| +#include "base/memory/shared_memory.h"
 | 
| +#include "base/memory/shared_memory_handle.h"
 | 
|  #include "base/metrics/field_trial.h"
 | 
|  #include "base/metrics/histogram.h"
 | 
| +#include "base/metrics/persistent_histogram_allocator.h"
 | 
| +#include "base/metrics/persistent_memory_allocator.h"
 | 
|  #include "base/process/process_handle.h"
 | 
|  #include "base/rand_util.h"
 | 
|  #include "base/single_thread_task_runner.h"
 | 
| @@ -1119,6 +1123,11 @@ ServiceRegistry* RenderProcessHostImpl::GetServiceRegistry() {
 | 
|    return mojo_application_host_->service_registry();
 | 
|  }
 | 
|  
 | 
| +scoped_ptr<base::SharedPersistentMemoryAllocator>
 | 
| +RenderProcessHostImpl::TakeMetricsAllocator() {
 | 
| +  return std::move(metrics_allocator_);
 | 
| +}
 | 
| +
 | 
|  const base::TimeTicks& RenderProcessHostImpl::GetInitTimeForNavigationMetrics()
 | 
|      const {
 | 
|    return init_time_;
 | 
| @@ -2359,6 +2368,31 @@ void RenderProcessHostImpl::RegisterProcessHostForSite(
 | 
|      map->RegisterProcess(site, process);
 | 
|  }
 | 
|  
 | 
| +void RenderProcessHostImpl::CreateSharedRendererHistogramAllocator() {
 | 
| +  DCHECK(!metrics_allocator_);
 | 
| +
 | 
| +  // Create a persistent memory segment for renderer histograms only if
 | 
| +  // they're active in the browser.
 | 
| +  if (!base::GlobalHistogramAllocator::Get())
 | 
| +    return;
 | 
| +
 | 
| +  // Get handle to the renderer process. Stop if there is none.
 | 
| +  base::ProcessHandle destination = GetHandle();
 | 
| +  if (destination == base::kNullProcessHandle)
 | 
| +    return;
 | 
| +
 | 
| +  // TODO(bcwhite): Update this with the correct memory size.
 | 
| +  scoped_ptr<base::SharedMemory> shm(new base::SharedMemory());
 | 
| +  shm->CreateAndMapAnonymous(2 << 20);  // 2 MiB
 | 
| +  metrics_allocator_.reset(new base::SharedPersistentMemoryAllocator(
 | 
| +      std::move(shm), GetID(), "RendererMetrics", /*readonly=*/false));
 | 
| +
 | 
| +  base::SharedMemoryHandle shm_handle;
 | 
| +  metrics_allocator_->shared_memory()->ShareToProcess(destination, &shm_handle);
 | 
| +  Send(new ChildProcessMsg_SetHistogramMemory(
 | 
| +      shm_handle, metrics_allocator_->shared_memory()->mapped_size()));
 | 
| +}
 | 
| +
 | 
|  void RenderProcessHostImpl::ProcessDied(bool already_dead,
 | 
|                                          RendererClosedDetails* known_details) {
 | 
|    // Our child process has died.  If we didn't expect it, it's a crash.
 | 
| @@ -2561,6 +2595,9 @@ void RenderProcessHostImpl::OnProcessLaunched() {
 | 
|  #if defined(OS_ANDROID)
 | 
|      UpdateProcessPriority();
 | 
|  #endif
 | 
| +
 | 
| +    // Share histograms between the renderer and this process.
 | 
| +    CreateSharedRendererHistogramAllocator();
 | 
|    }
 | 
|  
 | 
|    // NOTE: This needs to be before sending queued messages because
 | 
| 
 |