1*635a8641SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/process/process_metrics.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <utility>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/values.h"
11*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
12*635a8641SAndroid Build Coastguard Worker
13*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
14*635a8641SAndroid Build Coastguard Worker namespace {
CalculateEventsPerSecond(uint64_t event_count,uint64_t * last_event_count,base::TimeTicks * last_calculated)15*635a8641SAndroid Build Coastguard Worker int CalculateEventsPerSecond(uint64_t event_count,
16*635a8641SAndroid Build Coastguard Worker uint64_t* last_event_count,
17*635a8641SAndroid Build Coastguard Worker base::TimeTicks* last_calculated) {
18*635a8641SAndroid Build Coastguard Worker base::TimeTicks time = base::TimeTicks::Now();
19*635a8641SAndroid Build Coastguard Worker
20*635a8641SAndroid Build Coastguard Worker if (*last_event_count == 0) {
21*635a8641SAndroid Build Coastguard Worker // First call, just set the last values.
22*635a8641SAndroid Build Coastguard Worker *last_calculated = time;
23*635a8641SAndroid Build Coastguard Worker *last_event_count = event_count;
24*635a8641SAndroid Build Coastguard Worker return 0;
25*635a8641SAndroid Build Coastguard Worker }
26*635a8641SAndroid Build Coastguard Worker
27*635a8641SAndroid Build Coastguard Worker int64_t events_delta = event_count - *last_event_count;
28*635a8641SAndroid Build Coastguard Worker int64_t time_delta = (time - *last_calculated).InMicroseconds();
29*635a8641SAndroid Build Coastguard Worker if (time_delta == 0) {
30*635a8641SAndroid Build Coastguard Worker NOTREACHED();
31*635a8641SAndroid Build Coastguard Worker return 0;
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker
34*635a8641SAndroid Build Coastguard Worker *last_calculated = time;
35*635a8641SAndroid Build Coastguard Worker *last_event_count = event_count;
36*635a8641SAndroid Build Coastguard Worker
37*635a8641SAndroid Build Coastguard Worker int64_t events_delta_for_ms =
38*635a8641SAndroid Build Coastguard Worker events_delta * base::Time::kMicrosecondsPerSecond;
39*635a8641SAndroid Build Coastguard Worker // Round the result up by adding 1/2 (the second term resolves to 1/2 without
40*635a8641SAndroid Build Coastguard Worker // dropping down into floating point).
41*635a8641SAndroid Build Coastguard Worker return (events_delta_for_ms + time_delta / 2) / time_delta;
42*635a8641SAndroid Build Coastguard Worker }
43*635a8641SAndroid Build Coastguard Worker
44*635a8641SAndroid Build Coastguard Worker } // namespace
45*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
46*635a8641SAndroid Build Coastguard Worker
47*635a8641SAndroid Build Coastguard Worker namespace base {
48*635a8641SAndroid Build Coastguard Worker
49*635a8641SAndroid Build Coastguard Worker SystemMemoryInfoKB::SystemMemoryInfoKB() = default;
50*635a8641SAndroid Build Coastguard Worker
51*635a8641SAndroid Build Coastguard Worker SystemMemoryInfoKB::SystemMemoryInfoKB(const SystemMemoryInfoKB& other) =
52*635a8641SAndroid Build Coastguard Worker default;
53*635a8641SAndroid Build Coastguard Worker
SystemMetrics()54*635a8641SAndroid Build Coastguard Worker SystemMetrics::SystemMetrics() {
55*635a8641SAndroid Build Coastguard Worker committed_memory_ = 0;
56*635a8641SAndroid Build Coastguard Worker }
57*635a8641SAndroid Build Coastguard Worker
Sample()58*635a8641SAndroid Build Coastguard Worker SystemMetrics SystemMetrics::Sample() {
59*635a8641SAndroid Build Coastguard Worker SystemMetrics system_metrics;
60*635a8641SAndroid Build Coastguard Worker
61*635a8641SAndroid Build Coastguard Worker system_metrics.committed_memory_ = GetSystemCommitCharge();
62*635a8641SAndroid Build Coastguard Worker #if defined(OS_LINUX) || defined(OS_ANDROID)
63*635a8641SAndroid Build Coastguard Worker GetSystemMemoryInfo(&system_metrics.memory_info_);
64*635a8641SAndroid Build Coastguard Worker GetVmStatInfo(&system_metrics.vmstat_info_);
65*635a8641SAndroid Build Coastguard Worker GetSystemDiskInfo(&system_metrics.disk_info_);
66*635a8641SAndroid Build Coastguard Worker #endif
67*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS)
68*635a8641SAndroid Build Coastguard Worker GetSwapInfo(&system_metrics.swap_info_);
69*635a8641SAndroid Build Coastguard Worker #endif
70*635a8641SAndroid Build Coastguard Worker
71*635a8641SAndroid Build Coastguard Worker return system_metrics;
72*635a8641SAndroid Build Coastguard Worker }
73*635a8641SAndroid Build Coastguard Worker
ToValue() const74*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> SystemMetrics::ToValue() const {
75*635a8641SAndroid Build Coastguard Worker std::unique_ptr<DictionaryValue> res(new DictionaryValue());
76*635a8641SAndroid Build Coastguard Worker
77*635a8641SAndroid Build Coastguard Worker res->SetInteger("committed_memory", static_cast<int>(committed_memory_));
78*635a8641SAndroid Build Coastguard Worker #if defined(OS_LINUX) || defined(OS_ANDROID)
79*635a8641SAndroid Build Coastguard Worker std::unique_ptr<DictionaryValue> meminfo = memory_info_.ToValue();
80*635a8641SAndroid Build Coastguard Worker std::unique_ptr<DictionaryValue> vmstat = vmstat_info_.ToValue();
81*635a8641SAndroid Build Coastguard Worker meminfo->MergeDictionary(vmstat.get());
82*635a8641SAndroid Build Coastguard Worker res->Set("meminfo", std::move(meminfo));
83*635a8641SAndroid Build Coastguard Worker res->Set("diskinfo", disk_info_.ToValue());
84*635a8641SAndroid Build Coastguard Worker #endif
85*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS)
86*635a8641SAndroid Build Coastguard Worker res->Set("swapinfo", swap_info_.ToValue());
87*635a8641SAndroid Build Coastguard Worker #endif
88*635a8641SAndroid Build Coastguard Worker
89*635a8641SAndroid Build Coastguard Worker return std::move(res);
90*635a8641SAndroid Build Coastguard Worker }
91*635a8641SAndroid Build Coastguard Worker
CreateCurrentProcessMetrics()92*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateCurrentProcessMetrics() {
93*635a8641SAndroid Build Coastguard Worker #if !defined(OS_MACOSX) || defined(OS_IOS)
94*635a8641SAndroid Build Coastguard Worker return CreateProcessMetrics(base::GetCurrentProcessHandle());
95*635a8641SAndroid Build Coastguard Worker #else
96*635a8641SAndroid Build Coastguard Worker return CreateProcessMetrics(base::GetCurrentProcessHandle(), nullptr);
97*635a8641SAndroid Build Coastguard Worker #endif // !defined(OS_MACOSX) || defined(OS_IOS)
98*635a8641SAndroid Build Coastguard Worker }
99*635a8641SAndroid Build Coastguard Worker
100*635a8641SAndroid Build Coastguard Worker #if !defined(OS_FREEBSD) || !defined(OS_POSIX)
GetPlatformIndependentCPUUsage()101*635a8641SAndroid Build Coastguard Worker double ProcessMetrics::GetPlatformIndependentCPUUsage() {
102*635a8641SAndroid Build Coastguard Worker TimeDelta cumulative_cpu = GetCumulativeCPUUsage();
103*635a8641SAndroid Build Coastguard Worker TimeTicks time = TimeTicks::Now();
104*635a8641SAndroid Build Coastguard Worker
105*635a8641SAndroid Build Coastguard Worker if (last_cumulative_cpu_.is_zero()) {
106*635a8641SAndroid Build Coastguard Worker // First call, just set the last values.
107*635a8641SAndroid Build Coastguard Worker last_cumulative_cpu_ = cumulative_cpu;
108*635a8641SAndroid Build Coastguard Worker last_cpu_time_ = time;
109*635a8641SAndroid Build Coastguard Worker return 0;
110*635a8641SAndroid Build Coastguard Worker }
111*635a8641SAndroid Build Coastguard Worker
112*635a8641SAndroid Build Coastguard Worker TimeDelta system_time_delta = cumulative_cpu - last_cumulative_cpu_;
113*635a8641SAndroid Build Coastguard Worker TimeDelta time_delta = time - last_cpu_time_;
114*635a8641SAndroid Build Coastguard Worker DCHECK(!time_delta.is_zero());
115*635a8641SAndroid Build Coastguard Worker if (time_delta.is_zero())
116*635a8641SAndroid Build Coastguard Worker return 0;
117*635a8641SAndroid Build Coastguard Worker
118*635a8641SAndroid Build Coastguard Worker last_cumulative_cpu_ = cumulative_cpu;
119*635a8641SAndroid Build Coastguard Worker last_cpu_time_ = time;
120*635a8641SAndroid Build Coastguard Worker
121*635a8641SAndroid Build Coastguard Worker return 100.0 * system_time_delta.InMicrosecondsF() /
122*635a8641SAndroid Build Coastguard Worker time_delta.InMicrosecondsF();
123*635a8641SAndroid Build Coastguard Worker }
124*635a8641SAndroid Build Coastguard Worker #endif
125*635a8641SAndroid Build Coastguard Worker
126*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups)127*635a8641SAndroid Build Coastguard Worker int ProcessMetrics::CalculateIdleWakeupsPerSecond(
128*635a8641SAndroid Build Coastguard Worker uint64_t absolute_idle_wakeups) {
129*635a8641SAndroid Build Coastguard Worker return CalculateEventsPerSecond(absolute_idle_wakeups,
130*635a8641SAndroid Build Coastguard Worker &last_absolute_idle_wakeups_,
131*635a8641SAndroid Build Coastguard Worker &last_idle_wakeups_time_);
132*635a8641SAndroid Build Coastguard Worker }
133*635a8641SAndroid Build Coastguard Worker #else
GetIdleWakeupsPerSecond()134*635a8641SAndroid Build Coastguard Worker int ProcessMetrics::GetIdleWakeupsPerSecond() {
135*635a8641SAndroid Build Coastguard Worker NOTIMPLEMENTED(); // http://crbug.com/120488
136*635a8641SAndroid Build Coastguard Worker return 0;
137*635a8641SAndroid Build Coastguard Worker }
138*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_AIX)
139*635a8641SAndroid Build Coastguard Worker
140*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
CalculatePackageIdleWakeupsPerSecond(uint64_t absolute_package_idle_wakeups)141*635a8641SAndroid Build Coastguard Worker int ProcessMetrics::CalculatePackageIdleWakeupsPerSecond(
142*635a8641SAndroid Build Coastguard Worker uint64_t absolute_package_idle_wakeups) {
143*635a8641SAndroid Build Coastguard Worker return CalculateEventsPerSecond(absolute_package_idle_wakeups,
144*635a8641SAndroid Build Coastguard Worker &last_absolute_package_idle_wakeups_,
145*635a8641SAndroid Build Coastguard Worker &last_package_idle_wakeups_time_);
146*635a8641SAndroid Build Coastguard Worker }
147*635a8641SAndroid Build Coastguard Worker
148*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_MACOSX)
149*635a8641SAndroid Build Coastguard Worker } // namespace base
150