| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/process/process_metrics.h" | 5 #include "base/process/process_metrics.h" |
| 6 | 6 |
| 7 #include <mach/mach.h> | 7 #include <mach/mach.h> |
| 8 #include <mach/mach_vm.h> | 8 #include <mach/mach_vm.h> |
| 9 #include <mach/shared_region.h> | 9 #include <mach/shared_region.h> |
| 10 #include <sys/sysctl.h> | 10 #include <sys/sysctl.h> |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 TIME_VALUE_TO_TIMEVAL(&thread_info_data.user_time, &user_timeval); | 260 TIME_VALUE_TO_TIMEVAL(&thread_info_data.user_time, &user_timeval); |
| 261 TIME_VALUE_TO_TIMEVAL(&thread_info_data.system_time, &system_timeval); | 261 TIME_VALUE_TO_TIMEVAL(&thread_info_data.system_time, &system_timeval); |
| 262 timeradd(&user_timeval, &system_timeval, &task_timeval); | 262 timeradd(&user_timeval, &system_timeval, &task_timeval); |
| 263 | 263 |
| 264 // ... task info contains terminated time. | 264 // ... task info contains terminated time. |
| 265 TIME_VALUE_TO_TIMEVAL(&task_info_data.user_time, &user_timeval); | 265 TIME_VALUE_TO_TIMEVAL(&task_info_data.user_time, &user_timeval); |
| 266 TIME_VALUE_TO_TIMEVAL(&task_info_data.system_time, &system_timeval); | 266 TIME_VALUE_TO_TIMEVAL(&task_info_data.system_time, &system_timeval); |
| 267 timeradd(&user_timeval, &task_timeval, &task_timeval); | 267 timeradd(&user_timeval, &task_timeval, &task_timeval); |
| 268 timeradd(&system_timeval, &task_timeval, &task_timeval); | 268 timeradd(&system_timeval, &task_timeval, &task_timeval); |
| 269 | 269 |
| 270 struct timeval now; | 270 TimeTicks time = TimeTicks::Now(); |
| 271 int retval = gettimeofday(&now, NULL); | |
| 272 if (retval) | |
| 273 return 0; | |
| 274 | |
| 275 int64 time = TimeValToMicroseconds(now); | |
| 276 int64 task_time = TimeValToMicroseconds(task_timeval); | 271 int64 task_time = TimeValToMicroseconds(task_timeval); |
| 277 | 272 |
| 278 if (last_cpu_time_ == 0) { | 273 if (last_system_time_ == 0) { |
| 279 // First call, just set the last values. | 274 // First call, just set the last values. |
| 280 last_cpu_time_ = time; | 275 last_cpu_time_ = time; |
| 281 last_system_time_ = task_time; | 276 last_system_time_ = task_time; |
| 282 return 0; | 277 return 0; |
| 283 } | 278 } |
| 284 | 279 |
| 285 int64 system_time_delta = task_time - last_system_time_; | 280 int64 system_time_delta = task_time - last_system_time_; |
| 286 int64 time_delta = time - last_cpu_time_; | 281 int64 time_delta = (time - last_cpu_time_).InMicroseconds(); |
| 287 DCHECK_NE(0U, time_delta); | 282 DCHECK_NE(0U, time_delta); |
| 288 if (time_delta == 0) | 283 if (time_delta == 0) |
| 289 return 0; | 284 return 0; |
| 290 | 285 |
| 291 last_cpu_time_ = time; | 286 last_cpu_time_ = time; |
| 292 last_system_time_ = task_time; | 287 last_system_time_ = task_time; |
| 293 | 288 |
| 294 return static_cast<double>(system_time_delta * 100.0) / time_delta; | 289 return static_cast<double>(system_time_delta * 100.0) / time_delta; |
| 295 } | 290 } |
| 296 | 291 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 307 TASK_POWER_INFO, | 302 TASK_POWER_INFO, |
| 308 reinterpret_cast<task_info_t>(&power_info_data), | 303 reinterpret_cast<task_info_t>(&power_info_data), |
| 309 &power_info_count); | 304 &power_info_count); |
| 310 if (kr != KERN_SUCCESS) { | 305 if (kr != KERN_SUCCESS) { |
| 311 // Most likely cause: |task| is a zombie, or this is on a pre-10.8.4 system | 306 // Most likely cause: |task| is a zombie, or this is on a pre-10.8.4 system |
| 312 // where TASK_POWER_INFO isn't supported yet. | 307 // where TASK_POWER_INFO isn't supported yet. |
| 313 return 0; | 308 return 0; |
| 314 } | 309 } |
| 315 uint64_t absolute_idle_wakeups = power_info_data.task_platform_idle_wakeups; | 310 uint64_t absolute_idle_wakeups = power_info_data.task_platform_idle_wakeups; |
| 316 | 311 |
| 317 struct timeval now; | 312 TimeTicks time = TimeTicks::Now(); |
| 318 int retval = gettimeofday(&now, NULL); | |
| 319 if (retval) | |
| 320 return 0; | |
| 321 | 313 |
| 322 int64 time = TimeValToMicroseconds(now); | 314 if (last_absolute_idle_wakeups_ == 0) { |
| 323 | |
| 324 if (last_idle_wakeups_time_ == 0) { | |
| 325 // First call, just set the last values. | 315 // First call, just set the last values. |
| 326 last_idle_wakeups_time_ = time; | 316 last_idle_wakeups_time_ = time; |
| 327 last_absolute_idle_wakeups_ = absolute_idle_wakeups; | 317 last_absolute_idle_wakeups_ = absolute_idle_wakeups; |
| 328 return 0; | 318 return 0; |
| 329 } | 319 } |
| 330 | 320 |
| 331 int64 wakeups_delta = absolute_idle_wakeups - last_absolute_idle_wakeups_; | 321 int64 wakeups_delta = absolute_idle_wakeups - last_absolute_idle_wakeups_; |
| 332 int64 time_delta = time - last_idle_wakeups_time_; | 322 int64 time_delta = (time - last_idle_wakeups_time_).InMicroseconds(); |
| 333 DCHECK_NE(0U, time_delta); | 323 DCHECK_NE(0U, time_delta); |
| 334 if (time_delta == 0) | 324 if (time_delta == 0) |
| 335 return 0; | 325 return 0; |
| 336 | 326 |
| 337 last_idle_wakeups_time_ = time; | 327 last_idle_wakeups_time_ = time; |
| 338 last_absolute_idle_wakeups_ = absolute_idle_wakeups; | 328 last_absolute_idle_wakeups_ = absolute_idle_wakeups; |
| 339 | 329 |
| 340 // Round to average wakeups per second. | 330 // Round to average wakeups per second. |
| 341 const int kMicrosecondsPerSecond = 1000 * 1000; | 331 const int kMicrosecondsPerSecond = 1000 * 1000; |
| 342 return (wakeups_delta * kMicrosecondsPerSecond + time_delta/2) / time_delta; | 332 return (wakeups_delta * kMicrosecondsPerSecond + time_delta/2) / time_delta; |
| 343 } | 333 } |
| 344 | 334 |
| 345 bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const { | 335 bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const { |
| 346 return false; | 336 return false; |
| 347 } | 337 } |
| 348 | 338 |
| 349 ProcessMetrics::ProcessMetrics(ProcessHandle process, | 339 ProcessMetrics::ProcessMetrics(ProcessHandle process, |
| 350 ProcessMetrics::PortProvider* port_provider) | 340 ProcessMetrics::PortProvider* port_provider) |
| 351 : process_(process), | 341 : process_(process), |
| 352 last_cpu_time_(0), | |
| 353 last_system_time_(0), | 342 last_system_time_(0), |
| 354 last_idle_wakeups_time_(0), | |
| 355 last_absolute_idle_wakeups_(0), | 343 last_absolute_idle_wakeups_(0), |
| 356 port_provider_(port_provider) { | 344 port_provider_(port_provider) { |
| 357 processor_count_ = SysInfo::NumberOfProcessors(); | 345 processor_count_ = SysInfo::NumberOfProcessors(); |
| 358 } | 346 } |
| 359 | 347 |
| 360 mach_port_t ProcessMetrics::TaskForPid(ProcessHandle process) const { | 348 mach_port_t ProcessMetrics::TaskForPid(ProcessHandle process) const { |
| 361 mach_port_t task = MACH_PORT_NULL; | 349 mach_port_t task = MACH_PORT_NULL; |
| 362 if (port_provider_) | 350 if (port_provider_) |
| 363 task = port_provider_->TaskForPid(process_); | 351 task = port_provider_->TaskForPid(process_); |
| 364 if (task == MACH_PORT_NULL && process_ == getpid()) | 352 if (task == MACH_PORT_NULL && process_ == getpid()) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 383 kr = host_page_size(host, &page_size); | 371 kr = host_page_size(host, &page_size); |
| 384 if (kr) { | 372 if (kr) { |
| 385 DLOG(ERROR) << "Failed to fetch host page size."; | 373 DLOG(ERROR) << "Failed to fetch host page size."; |
| 386 return 0; | 374 return 0; |
| 387 } | 375 } |
| 388 | 376 |
| 389 return (data.active_count * page_size) / 1024; | 377 return (data.active_count * page_size) / 1024; |
| 390 } | 378 } |
| 391 | 379 |
| 392 } // namespace base | 380 } // namespace base |
| OLD | NEW |