Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index 5cc326e7c270ee25e499436d1d63b39f864e4acb..6c4e7af10689e90feba5c56b03efec481a2609af 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<RenderFrameSetup> 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() { |