diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-19 01:31:03 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-19 01:31:03 +0000 |
commit | 0d525036512529fc73287726ac65649040672f86 (patch) | |
tree | c7228937ed591491d541b76aee909ee3090fb1db /base/process_util_posix.cc | |
parent | 27f2b6626e1c0e71d8b8e5d20e017beee762d7d6 (diff) | |
download | chromium_src-0d525036512529fc73287726ac65649040672f86.zip chromium_src-0d525036512529fc73287726ac65649040672f86.tar.gz chromium_src-0d525036512529fc73287726ac65649040672f86.tar.bz2 |
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
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35025 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/process_util_posix.cc')
-rw-r--r-- | base/process_util_posix.cc | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/base/process_util_posix.cc b/base/process_util_posix.cc index 16469db..4392c7b 100644 --- a/base/process_util_posix.cc +++ b/base/process_util_posix.cc @@ -360,36 +360,20 @@ bool LaunchApp(const CommandLine& cl, 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 @@ int64 TimeValToMicroseconds(const struct timeval& tv) { 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 |