From fdeac26a1bf4babb74961fc08967825c9f45a67f Mon Sep 17 00:00:00 2001 From: "kouhei@chromium.org" Date: Thu, 10 Jul 2014 12:52:51 +0000 Subject: [PATCH] Update Memory.RendererUsed only after Blink is initialized Yak shaving to land https://codereview.chromium.org/380533003/ Before the patch, |MemoryObserver| called |GetMemoryUsageKB()| without any check, which is only valid after webkit is initialized. GetMemoryUsageKB queries |v8::Isolate::GetCurrent()| internally, but the query fails on DCHECK on debug builds. This patch moves the |MemoryObserver| instantiation inside |RenderThreadImpl::EnsureWebKitInitialized|. BUG=None Review URL: https://codereview.chromium.org/380603002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282321 0039d316-1c4b-4281-b951-d872f2087c98 --- content/renderer/render_thread_impl.cc | 28 ++++++++++++++++++++++++++++ content/renderer/render_thread_impl.h | 3 +++ content/renderer/renderer_main.cc | 23 ----------------------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 5cc326e7c270..6c4e7af10689 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -32,6 +32,7 @@ #include "content/child/appcache/appcache_dispatcher.h" #include "content/child/appcache/appcache_frontend_impl.h" #include "content/child/child_histogram_message_filter.h" +#include "content/child/content_child_helpers.h" #include "content/child/db_message_filter.h" #include "content/child/indexed_db/indexed_db_dispatcher.h" #include "content/child/indexed_db/indexed_db_message_filter.h" @@ -292,6 +293,23 @@ void CreateRenderFrameSetup(mojo::InterfaceRequest request) { } // namespace +// For measuring memory usage after each task. Behind a command line flag. +class MemoryObserver : public base::MessageLoop::TaskObserver { + public: + MemoryObserver() {} + virtual ~MemoryObserver() {} + + virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE { + } + + virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE { + HISTOGRAM_MEMORY_KB("Memory.RendererUsed", GetMemoryUsageKB()); + } + + private: + DISALLOW_COPY_AND_ASSIGN(MemoryObserver); +}; + RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() { custom_histograms_.insert("V8.MemoryExternalFragmentationTotal"); custom_histograms_.insert("V8.MemoryHeapSampleTotalCommitted"); @@ -549,6 +567,11 @@ void RenderThreadImpl::Shutdown() { ChildThread::Shutdown(); + if (memory_observer_) { + message_loop()->RemoveTaskObserver(memory_observer_.get()); + memory_observer_.reset(); + } + // Wait for all databases to be closed. if (webkit_platform_support_) { webkit_platform_support_->web_database_observer_impl()-> @@ -876,6 +899,11 @@ void RenderThreadImpl::EnsureWebKitInitialized() { if (!command_line.HasSwitch(switches::kEnableDeferredImageDecoding) && !is_impl_side_painting_enabled_) SkGraphics::SetImageCacheByteLimit(0u); + + if (command_line.HasSwitch(switches::kMemoryMetrics)) { + memory_observer_.reset(new MemoryObserver()); + message_loop()->AddTaskObserver(memory_observer_.get()); + } } void RenderThreadImpl::RegisterSchemes() { diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 3bc7f9dc887e..5a679b764d4d 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h @@ -89,6 +89,7 @@ class IndexedDBDispatcher; class InputEventFilter; class InputHandlerManager; class MediaStreamCenter; +class MemoryObserver; class PeerConnectionDependencyFactory; class MidiMessageFilter; class NetInfoDispatcher; @@ -567,6 +568,8 @@ class CONTENT_EXPORT RenderThreadImpl : public RenderThread, // backed GpuMemoryBuffers prevent this. crbug.com/325045 base::ThreadChecker allocate_gpu_memory_buffer_thread_checker_; + scoped_ptr memory_observer_; + // Compositor settings bool is_gpu_rasterization_enabled_; bool is_gpu_rasterization_forced_; diff --git a/content/renderer/renderer_main.cc b/content/renderer/renderer_main.cc index 242af718ce85..02d17e91d50d 100644 --- a/content/renderer/renderer_main.cc +++ b/content/renderer/renderer_main.cc @@ -22,7 +22,6 @@ #include "base/time/time.h" #include "base/timer/hi_res_timer_manager.h" #include "content/child/child_process.h" -#include "content/child/content_child_helpers.h" #include "content/common/content_constants_internal.h" #include "content/public/common/content_switches.h" #include "content/public/common/main_function_params.h" @@ -95,22 +94,6 @@ class RendererMessageLoopObserver : public base::MessageLoop::TaskObserver { DISALLOW_COPY_AND_ASSIGN(RendererMessageLoopObserver); }; -// For measuring memory usage after each task. Behind a command line flag. -class MemoryObserver : public base::MessageLoop::TaskObserver { - public: - MemoryObserver() {} - virtual ~MemoryObserver() {} - - virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE { - } - - virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE { - HISTOGRAM_MEMORY_KB("Memory.RendererUsed", GetMemoryUsageKB()); - } - private: - DISALLOW_COPY_AND_ASSIGN(MemoryObserver); -}; - } // namespace // mainline routine for running as the Renderer process @@ -170,12 +153,6 @@ int RendererMain(const MainFunctionParams& parameters) { #endif main_message_loop.AddTaskObserver(&task_observer); - scoped_ptr memory_observer; - if (parsed_command_line.HasSwitch(switches::kMemoryMetrics)) { - memory_observer.reset(new MemoryObserver()); - main_message_loop.AddTaskObserver(memory_observer.get()); - } - base::PlatformThread::SetName("CrRendererMain"); bool no_sandbox = parsed_command_line.HasSwitch(switches::kNoSandbox); -- 2.11.4.GIT