process_metrics_freebsd.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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 3// found in the LICENSE file. 4 5#include "base/process/process_metrics.h" 6 7#include <sys/sysctl.h> 8#include <sys/user.h> 9#include <unistd.h> 10 11#include "base/sys_info.h" 12 13namespace base { 14 15ProcessMetrics::ProcessMetrics(ProcessHandle process) 16 : process_(process), 17 last_cpu_time_(0), 18 last_system_time_(0), 19 last_cpu_(0) { 20 processor_count_ = base::SysInfo::NumberOfProcessors(); 21} 22 23// static 24ProcessMetrics* ProcessMetrics::CreateProcessMetrics(ProcessHandle process) { 25 return new ProcessMetrics(process); 26} 27 28size_t ProcessMetrics::GetPagefileUsage() const { 29 struct kinfo_proc info; 30 int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process_ }; 31 size_t length = sizeof(info); 32 33 if (sysctl(mib, arraysize(mib), &info, &length, NULL, 0) < 0) 34 return 0; 35 36 return info.ki_size; 37} 38 39size_t ProcessMetrics::GetPeakPagefileUsage() const { 40 return 0; 41} 42 43size_t ProcessMetrics::GetWorkingSetSize() const { 44 struct kinfo_proc info; 45 int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process_ }; 46 size_t length = sizeof(info); 47 48 if (sysctl(mib, arraysize(mib), &info, &length, NULL, 0) < 0) 49 return 0; 50 51 return info.ki_rssize * getpagesize(); 52} 53 54size_t ProcessMetrics::GetPeakWorkingSetSize() const { 55 return 0; 56} 57 58bool ProcessMetrics::GetMemoryBytes(size_t* private_bytes, 59 size_t* shared_bytes) { 60 WorkingSetKBytes ws_usage; 61 if (!GetWorkingSetKBytes(&ws_usage)) 62 return false; 63 64 if (private_bytes) 65 *private_bytes = ws_usage.priv << 10; 66 67 if (shared_bytes) 68 *shared_bytes = ws_usage.shared * 1024; 69 70 return true; 71} 72 73bool ProcessMetrics::GetWorkingSetKBytes(WorkingSetKBytes* ws_usage) const { 74// TODO(bapt) be sure we can't be precise 75 size_t priv = GetWorkingSetSize(); 76 if (!priv) 77 return false; 78 ws_usage->priv = priv / 1024; 79 ws_usage->shareable = 0; 80 ws_usage->shared = 0; 81 82 return true; 83} 84 85double ProcessMetrics::GetCPUUsage() { 86 struct kinfo_proc info; 87 int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process_ }; 88 size_t length = sizeof(info); 89 90 struct timeval now; 91 int retval = gettimeofday(&now, NULL); 92 if (retval) 93 return 0; 94 95 if (sysctl(mib, arraysize(mib), &info, &length, NULL, 0) < 0) 96 return 0; 97 98 return (info.ki_pctcpu / FSCALE) * 100.0; 99} 100 101bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const { 102 return false; 103} 104 105size_t GetSystemCommitCharge() { 106 int mib[2], pagesize; 107 unsigned long mem_total, mem_free, mem_inactive; 108 size_t length = sizeof(mem_total); 109 110 if (sysctl(mib, arraysize(mib), &mem_total, &length, NULL, 0) < 0) 111 return 0; 112 113 length = sizeof(mem_free); 114 if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &length, NULL, 0) < 0) 115 return 0; 116 117 length = sizeof(mem_inactive); 118 if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &length, 119 NULL, 0) < 0) { 120 return 0; 121 } 122 123 pagesize = getpagesize(); 124 125 return mem_total - (mem_free*pagesize) - (mem_inactive*pagesize); 126} 127 128} // namespace base 129