Chromium Code Reviews| Index: base/process_util_posix.cc |
| =================================================================== |
| --- base/process_util_posix.cc (revision 6214) |
| +++ base/process_util_posix.cc (working copy) |
| @@ -4,12 +4,17 @@ |
| #include "base/process_util.h" |
| +#include <sys/resource.h> |
| +#include <sys/time.h> |
| #include <sys/types.h> |
| #include <unistd.h> |
| #include "base/basictypes.h" |
| +#include "base/logging.h" |
| #include "base/sys_info.h" |
| +const int kMicrosecondsPerSecond = 1000000; |
| + |
| namespace base { |
| int GetCurrentProcId() { |
| @@ -46,4 +51,52 @@ |
| // setpriority() or sched_getscheduler, but these all require extra rights. |
| } |
| +namespace { |
| + |
| +int64 TimeValToMicroseconds(const struct timeval& tv) { |
| + return tv.tv_sec * kMicrosecondsPerSecond + tv.tv_usec; |
| +} |
| + |
| +} |
| + |
| +int ProcessMetrics::GetCPUUsage() { |
| + int retval; |
|
pink (ping after 24hrs)
2008/12/02 19:36:11
declare retval where it's initialized or give it a
|
| + struct timeval now; |
| + struct rusage usage; |
| + |
| + 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_; |
|
pink (ping after 24hrs)
2008/12/02 19:36:11
does |processor_count_| get scaled to an int64 or
Avi (use Gerrit)
2008/12/02 19:40:31
I'm pretty sure int64/int32 causes the int32 to be
|
| + int64 time = TimeValToMicroseconds(now); |
| + |
| + if ((last_system_time_ == 0) || (last_time_ == 0)) { |
|
pink (ping after 24hrs)
2008/12/02 19:36:11
don't need the extra parens, but not a biggie.
Avi (use Gerrit)
2008/12/02 19:40:31
Straight from the Windows code.
|
| + // 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; |
| +} |
| + |
| } // namespace base |