Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4191)

Unified Diff: chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc

Issue 1081323003: Convert renderer JS memory usage reporting to use Mojo. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@utility-process-report-js-memory
Patch Set: Rebase and fix tests. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/memory_internals/memory_internals_proxy.h ('k') | chrome/chrome_renderer.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc
diff --git a/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc b/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc
index abed85c140e5ad6026f0a663998565808277b96f..3a6defefc75395116e7343fa7a591417a7ae365a 100644
--- a/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc
+++ b/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc
@@ -4,11 +4,15 @@
#include "chrome/browser/ui/webui/memory_internals/memory_internals_proxy.h"
+#include <map>
#include <set>
#include <string>
+#include <utility>
#include <vector>
#include "base/bind.h"
+#include "base/memory/linked_ptr.h"
+#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "base/sys_info.h"
#include "base/values.h"
@@ -17,6 +21,7 @@
#include "chrome/browser/memory_details.h"
#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/prerender/prerender_manager_factory.h"
+#include "chrome/browser/process_resource_usage.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
@@ -29,13 +34,11 @@
#include "chrome/common/render_messages.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
+#include "content/public/common/service_registry.h"
#if defined(ENABLE_PRINT_PREVIEW)
#include "chrome/browser/printing/background_printing_manager.h"
@@ -118,34 +121,52 @@ void GetAllWebContents(std::set<content::WebContents*>* web_contents) {
} // namespace
-class RendererDetails : public content::NotificationObserver {
+class RendererDetails {
public:
typedef base::Callback<void(const base::ProcessId pid,
const size_t v8_allocated,
const size_t v8_used)> V8DataCallback;
explicit RendererDetails(const V8DataCallback& callback)
- : callback_(callback) {
- registrar_.Add(this, chrome::NOTIFICATION_RENDERER_V8_HEAP_STATS_COMPUTED,
- content::NotificationService::AllSources());
- }
- ~RendererDetails() override {}
+ : callback_(callback), weak_factory_(this) {}
+ ~RendererDetails() {}
void Request() {
for (std::set<content::WebContents*>::iterator iter = web_contents_.begin();
- iter != web_contents_.end(); ++iter)
- (*iter)->GetRenderViewHost()->Send(new ChromeViewMsg_GetV8HeapStats);
+ iter != web_contents_.end(); ++iter) {
+ auto rph = (*iter)->GetRenderViewHost()->GetProcess();
+ auto resource_usage = resource_usage_reporters_[(*iter)];
+ DCHECK(resource_usage.get());
+ resource_usage->Refresh(base::Bind(&RendererDetails::OnRefreshDone,
+ weak_factory_.GetWeakPtr(), *iter,
+ base::GetProcId(rph->GetHandle())));
+ }
}
void AddWebContents(content::WebContents* content) {
web_contents_.insert(content);
+
+ auto rph = content->GetRenderViewHost()->GetProcess();
+ content::ServiceRegistry* service_registry = rph->GetServiceRegistry();
+ ResourceUsageReporterPtr service;
+ if (service_registry)
+ service_registry->ConnectToRemoteService(&service);
+ resource_usage_reporters_.insert(std::make_pair(
+ content, make_linked_ptr(new ProcessResourceUsage(service.Pass()))));
+ DCHECK_EQ(web_contents_.size(), resource_usage_reporters_.size());
}
void Clear() {
web_contents_.clear();
+ resource_usage_reporters_.clear();
+ weak_factory_.InvalidateWeakPtrs();
}
void RemoveWebContents(base::ProcessId) {
+ // This function should only be called once for each WebContents, so this
+ // should be non-empty every time it's called.
+ DCHECK(!web_contents_.empty());
+
// We don't have to detect which content is the caller of this method.
if (!web_contents_.empty())
web_contents_.erase(web_contents_.begin());
@@ -156,23 +177,19 @@ class RendererDetails : public content::NotificationObserver {
}
private:
- // NotificationObserver:
- void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) override {
- const base::ProcessId* pid =
- content::Source<const base::ProcessId>(source).ptr();
- const ChromeRenderMessageFilter::V8HeapStatsDetails* v8_heap =
- content::Details<const ChromeRenderMessageFilter::V8HeapStatsDetails>(
- details).ptr();
- callback_.Run(*pid,
- v8_heap->v8_memory_allocated(),
- v8_heap->v8_memory_used());
+ void OnRefreshDone(content::WebContents* content, const base::ProcessId pid) {
+ auto iter = resource_usage_reporters_.find(content);
+ DCHECK(iter != resource_usage_reporters_.end());
+ linked_ptr<ProcessResourceUsage> usage = iter->second;
+ callback_.Run(pid, usage->GetV8MemoryAllocated(), usage->GetV8MemoryUsed());
}
V8DataCallback callback_;
- content::NotificationRegistrar registrar_;
std::set<content::WebContents*> web_contents_; // This class does not own
+ std::map<content::WebContents*, linked_ptr<ProcessResourceUsage>>
+ resource_usage_reporters_;
+
+ base::WeakPtrFactory<RendererDetails> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RendererDetails);
};
« no previous file with comments | « chrome/browser/ui/webui/memory_internals/memory_internals_proxy.h ('k') | chrome/chrome_renderer.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698