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

Unified Diff: chrome/browser/task_manager/child_process_resource_provider.cc

Issue 972083002: Report utility process JS memory in task manager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@v8-pac-oop
Patch Set: Redesign. 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 | « no previous file | chrome/chrome_utility.gypi » ('j') | content/public/browser/browser_child_process_host.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/task_manager/child_process_resource_provider.cc
diff --git a/chrome/browser/task_manager/child_process_resource_provider.cc b/chrome/browser/task_manager/child_process_resource_provider.cc
index bf74138859e5f6f83281fd1ff163b236542c0d3f..2273305436f4358c4561ed9c932c597fd5fa408d 100644
--- a/chrome/browser/task_manager/child_process_resource_provider.cc
+++ b/chrome/browser/task_manager/child_process_resource_provider.cc
@@ -7,14 +7,18 @@
#include <vector>
#include "base/i18n/rtl.h"
+#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "chrome/browser/task_manager/resource_provider.h"
#include "chrome/browser/task_manager/task_manager.h"
#include "chrome/grit/generated_resources.h"
#include "components/nacl/common/nacl_process_type.h"
+#include "content/public/browser/browser_child_process_host.h"
#include "content/public/browser/browser_child_process_host_iterator.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_data.h"
+#include "content/public/browser/process_resource_usage.h"
+#include "content/public/common/service_registry.h"
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
@@ -22,6 +26,7 @@
using content::BrowserChildProcessHostIterator;
using content::BrowserThread;
+using content::ProcessResourceUsage;
using content::WebContents;
namespace task_manager {
@@ -43,6 +48,10 @@ class ChildProcessResource : public Resource {
Type GetType() const override;
bool SupportNetworkUsage() const override;
void SetSupportNetworkUsage() override;
+ void Refresh() override;
+ bool ReportsV8MemoryStats() const override;
+ size_t GetV8MemoryAllocated() const override;
+ size_t GetV8MemoryUsed() const override;
// Returns the pid of the child process.
int process_id() const { return pid_; }
@@ -52,6 +61,12 @@ class ChildProcessResource : public Resource {
// process would be "Plugin: Flash" when name is "Flash".
base::string16 GetLocalizedTitle() const;
+ static void GetProcessUsageOnIOThread(
+ int id, base::WeakPtr<ChildProcessResource> weak_ptr);
+
+ void OnGetProcessUsageDone(
+ mojo::InterfacePtrInfo<content::ResourceUsageReporter> info);
+
int process_type_;
base::string16 name_;
base::ProcessHandle handle_;
@@ -59,17 +74,43 @@ class ChildProcessResource : public Resource {
int unique_process_id_;
mutable base::string16 title_;
bool network_usage_support_;
+ scoped_ptr<ProcessResourceUsage> resource_usage_;
// The icon painted for the child processs.
// TODO(jcampan): we should have plugin specific icons for well-known
// plugins.
static gfx::ImageSkia* default_icon_;
+ base::WeakPtrFactory<ChildProcessResource> weak_factory_;
+
DISALLOW_COPY_AND_ASSIGN(ChildProcessResource);
};
gfx::ImageSkia* ChildProcessResource::default_icon_ = NULL;
+// static
+void ChildProcessResource::GetProcessUsageOnIOThread(
afakhry 2015/05/06 17:16:27 What do you think of moving the functionality of:
ncarter (slow) 2015/05/07 20:12:44 GetProcessUsageInfo probably can move into Process
Anand Mistry (off Chromium) 2015/05/11 05:41:31 Apart from PostTaskAndReplyWithResult, I'm going t
ncarter (slow) 2015/05/11 20:35:39 I'm fine with the compromise you've struck. My ini
+ int id, base::WeakPtr<ChildProcessResource> weak_ptr) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ content::BrowserChildProcessHost* host =
+ content::BrowserChildProcessHost::Get(id);
+ if (!host)
+ return;
+
+ content::ServiceRegistry* registry = host->GetServiceRegistry();
+ if (!registry)
+ return;
+
+ content::ResourceUsageReporterPtr service;
+ registry->ConnectToRemoteService(&service);
+ auto interface_info = service.PassInterface();
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(
+ &ChildProcessResource::OnGetProcessUsageDone,
+ weak_ptr, base::Passed(&interface_info)));
+}
+
ChildProcessResource::ChildProcessResource(
int process_type,
const base::string16& name,
@@ -79,7 +120,8 @@ ChildProcessResource::ChildProcessResource(
name_(name),
handle_(handle),
unique_process_id_(unique_process_id),
- network_usage_support_(false) {
+ network_usage_support_(false),
+ weak_factory_(this) {
// We cache the process id because it's not cheap to calculate, and it won't
// be available when we get the plugin disconnected notification.
pid_ = base::GetProcId(handle);
@@ -88,11 +130,26 @@ ChildProcessResource::ChildProcessResource(
default_icon_ = rb.GetImageSkiaNamed(IDR_PLUGINS_FAVICON);
// TODO(jabdelmalek): use different icon for web workers.
}
+ BrowserThread::PostTask(
ncarter (slow) 2015/05/07 20:12:43 It might work well to structure this as a PostTask
Anand Mistry (off Chromium) 2015/05/11 05:41:31 Done. Aside: Many of Mojo's types are move-only,
ncarter (slow) 2015/05/11 20:35:40 Great to know, thanks!
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(
+ &ChildProcessResource::GetProcessUsageOnIOThread,
+ unique_process_id, weak_factory_.GetWeakPtr()));
}
ChildProcessResource::~ChildProcessResource() {
}
+void ChildProcessResource::OnGetProcessUsageDone(
+ mojo::InterfacePtrInfo<content::ResourceUsageReporter> info) {
ncarter (slow) 2015/05/07 20:12:43 Just curious -- do we expect that this approach wi
Anand Mistry (off Chromium) 2015/05/11 05:41:31 Yes. I see no reason why this wouldn't work. Creat
ncarter (slow) 2015/05/11 20:35:40 Excellent.
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (info.is_valid()) {
+ content::ResourceUsageReporterPtr service;
+ service.Bind(info.Pass());
+ resource_usage_ = content::ProcessResourceUsage::Create(service.Pass());
+ }
+}
+
// Resource methods:
base::string16 ChildProcessResource::GetTitle() const {
if (title_.empty())
@@ -200,6 +257,29 @@ base::string16 ChildProcessResource::GetLocalizedTitle() const {
return title;
}
+void ChildProcessResource::Refresh() {
+ if (resource_usage_)
+ resource_usage_->Refresh();
afakhry 2015/05/06 17:16:27 Is it possible if you add a callback of type: void
ncarter (slow) 2015/05/07 20:12:43 amistry has addressed this to my satisfaction in a
+}
+
+bool ChildProcessResource::ReportsV8MemoryStats() const {
+ if (resource_usage_)
ncarter (slow) 2015/05/07 20:12:43 It's not clear if a |resource_usage_| will be succ
Anand Mistry (off Chromium) 2015/05/11 05:41:31 If the process host has a ServiceRegistry, then ye
ncarter (slow) 2015/05/11 20:35:40 Acknowledged.
+ return resource_usage_->ReportsV8MemoryStats();
+ return false;
+}
+
+size_t ChildProcessResource::GetV8MemoryAllocated() const {
+ if (resource_usage_)
+ return resource_usage_->GetV8MemoryAllocated();
+ return 0;
+}
+
+size_t ChildProcessResource::GetV8MemoryUsed() const {
+ if (resource_usage_)
+ return resource_usage_->GetV8MemoryUsed();
+ return 0;
+}
+
////////////////////////////////////////////////////////////////////////////////
// ChildProcessResourceProvider class
////////////////////////////////////////////////////////////////////////////////
« no previous file with comments | « no previous file | chrome/chrome_utility.gypi » ('j') | content/public/browser/browser_child_process_host.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698