| Index: base/process_util_posix.cc
|
| ===================================================================
|
| --- base/process_util_posix.cc (revision 35019)
|
| +++ base/process_util_posix.cc (working copy)
|
| @@ -360,36 +360,20 @@
|
| return LaunchApp(cl.argv(), no_files, wait, process_handle);
|
| }
|
|
|
| -#if !defined(OS_MACOSX)
|
| -ProcessMetrics::ProcessMetrics(ProcessHandle process)
|
| -#else
|
| -ProcessMetrics::ProcessMetrics(ProcessHandle process,
|
| - ProcessMetrics::PortProvider* port_provider)
|
| -#endif
|
| - : process_(process),
|
| - last_time_(0),
|
| - last_system_time_(0)
|
| +ProcessMetrics::ProcessMetrics(ProcessHandle process) : process_(process),
|
| + last_time_(0),
|
| + last_system_time_(0)
|
| #if defined(OS_LINUX)
|
| - , last_cpu_(0)
|
| -#elif defined (OS_MACOSX)
|
| - , port_provider_(port_provider)
|
| + , last_cpu_(0)
|
| #endif
|
| {
|
| processor_count_ = base::SysInfo::NumberOfProcessors();
|
| }
|
|
|
| // static
|
| -#if !defined(OS_MACOSX)
|
| ProcessMetrics* ProcessMetrics::CreateProcessMetrics(ProcessHandle process) {
|
| return new ProcessMetrics(process);
|
| }
|
| -#else
|
| -ProcessMetrics* ProcessMetrics::CreateProcessMetrics(
|
| - ProcessHandle process,
|
| - ProcessMetrics::PortProvider* port_provider) {
|
| - return new ProcessMetrics(process, port_provider);
|
| -}
|
| -#endif
|
|
|
| ProcessMetrics::~ProcessMetrics() { }
|
|
|
| @@ -510,6 +494,49 @@
|
| return tv.tv_sec * kMicrosecondsPerSecond + tv.tv_usec;
|
| }
|
|
|
| +#if defined(OS_MACOSX)
|
| +// TODO(port): this function only returns the *current* CPU's usage;
|
| +// we want to return this->process_'s CPU usage.
|
| +int ProcessMetrics::GetCPUUsage() {
|
| + struct timeval now;
|
| + struct rusage usage;
|
| +
|
| + int retval = gettimeofday(&now, NULL);
|
| + if (retval)
|
| + return 0;
|
| + retval = getrusage(RUSAGE_SELF, &usage);
|
| + if (retval)
|
| + return 0;
|
| +
|
| + int64 system_time = (TimeValToMicroseconds(usage.ru_stime) +
|
| + TimeValToMicroseconds(usage.ru_utime)) /
|
| + processor_count_;
|
| + int64 time = TimeValToMicroseconds(now);
|
| +
|
| + if ((last_system_time_ == 0) || (last_time_ == 0)) {
|
| + // First call, just set the last values.
|
| + last_system_time_ = system_time;
|
| + last_time_ = time;
|
| + return 0;
|
| + }
|
| +
|
| + int64 system_time_delta = system_time - last_system_time_;
|
| + int64 time_delta = time - last_time_;
|
| + DCHECK(time_delta != 0);
|
| + if (time_delta == 0)
|
| + return 0;
|
| +
|
| + // We add time_delta / 2 so the result is rounded.
|
| + int cpu = static_cast<int>((system_time_delta * 100 + time_delta / 2) /
|
| + time_delta);
|
| +
|
| + last_system_time_ = system_time;
|
| + last_time_ = time;
|
| +
|
| + return cpu;
|
| +}
|
| +#endif
|
| +
|
| // Executes the application specified by |cl| and wait for it to exit. Stores
|
| // the output (stdout) in |output|. If |do_search_path| is set, it searches the
|
| // path for the application; in that case, |envp| must be null, and it will use
|
|
|