[go: nahoru, domu]

Revert 35025 - Revert 34994, maybe it regressed startup perf  Fix cpu/memory measurements on OS X.

Right now, this only works for the current process; support for child processes will be added in a later CL.

BUG=13156,25454
TEST=Hook up task manager (connect menu item to commandDispatch:, give it the right tag). Stats for the browser process should now be right, and %cpu should be 0 (for now) for all other processes.

Review URL: http://codereview.chromium.org/500118

TBR=thakis@chromium.org
Review URL: http://codereview.chromium.org/504068

TBR=thakis@chromium.org
Review URL: http://codereview.chromium.org/505056

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35043 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/process_util.h b/base/process_util.h
index 1122de7f..2bb53964 100644
--- a/base/process_util.h
+++ b/base/process_util.h
@@ -317,6 +317,11 @@
 // priv:           Pages mapped only by this process
 // shared:         PSS or 0 if the kernel doesn't support this
 // shareable:      0
+//
+// On OS X: TODO(thakis): Revise.
+// priv:           Memory.
+// shared:         0
+// shareable:      0
 struct WorkingSetKBytes {
   WorkingSetKBytes() : priv(0), shareable(0), shared(0) {}
   size_t priv;
@@ -359,7 +364,23 @@
  public:
   // Creates a ProcessMetrics for the specified process.
   // The caller owns the returned object.
+#if !defined(OS_MACOSX)
   static ProcessMetrics* CreateProcessMetrics(ProcessHandle process);
+#else
+  class PortProvider {
+   public:
+    // Should return the mach task for |process| if possible, or else 0. Only
+    // processes that this returns tasks for will have metrics on OS X (except
+    // for the current process, which always gets metrics).
+    virtual mach_port_t TaskForPid(ProcessHandle process) const = 0;
+  };
+
+  // The port provider needs to outlive the ProcessMetrics object returned by
+  // this function. If NULL is passed as provider, the returned object
+  // only returns valid metrics if |process| is the current process.
+  static ProcessMetrics* CreateProcessMetrics(ProcessHandle process,
+                                              PortProvider* port_provider);
+#endif
 
   ~ProcessMetrics();
 
@@ -407,7 +428,11 @@
   bool GetIOCounters(IoCounters* io_counters) const;
 
  private:
+#if !defined(OS_MACOSX)
   explicit ProcessMetrics(ProcessHandle process);
+#else
+  ProcessMetrics(ProcessHandle process, PortProvider* port_provider);
+#endif
 
   ProcessHandle process_;
 
@@ -423,6 +448,13 @@
   int last_cpu_;
 #endif
 
+#if defined(OS_MACOSX)
+  // Queries the port provider if it's set.
+  mach_port_t TaskForPid(ProcessHandle process) const;
+
+  PortProvider* port_provider_;
+#endif
+
   DISALLOW_EVIL_CONSTRUCTORS(ProcessMetrics);
 };