xref: /aosp_15_r20/external/libchrome/base/process/process_metrics.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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