xref: /aosp_15_r20/external/cronet/base/process/process_metrics.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/process/process_metrics.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <utility>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/notimplemented.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
20*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
CalculateEventsPerSecond(uint64_t event_count,uint64_t * last_event_count,base::TimeTicks * last_calculated)21*6777b538SAndroid Build Coastguard Worker int CalculateEventsPerSecond(uint64_t event_count,
22*6777b538SAndroid Build Coastguard Worker                              uint64_t* last_event_count,
23*6777b538SAndroid Build Coastguard Worker                              base::TimeTicks* last_calculated) {
24*6777b538SAndroid Build Coastguard Worker   const base::TimeTicks time = base::TimeTicks::Now();
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker   int events_per_second = 0;
27*6777b538SAndroid Build Coastguard Worker   if (*last_event_count != 0) {
28*6777b538SAndroid Build Coastguard Worker     const uint64_t events_delta = event_count - *last_event_count;
29*6777b538SAndroid Build Coastguard Worker     const base::TimeDelta time_delta = time - *last_calculated;
30*6777b538SAndroid Build Coastguard Worker     DCHECK(!time_delta.is_zero());
31*6777b538SAndroid Build Coastguard Worker     events_per_second = ClampRound(events_delta / time_delta.InSecondsF());
32*6777b538SAndroid Build Coastguard Worker   }
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker   *last_calculated = time;
35*6777b538SAndroid Build Coastguard Worker   *last_event_count = event_count;
36*6777b538SAndroid Build Coastguard Worker   return events_per_second;
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker #endif
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker }  // namespace
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker SystemMemoryInfoKB::SystemMemoryInfoKB() = default;
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker SystemMemoryInfoKB::SystemMemoryInfoKB(const SystemMemoryInfoKB&) = default;
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker SystemMemoryInfoKB& SystemMemoryInfoKB::operator=(const SystemMemoryInfoKB&) =
47*6777b538SAndroid Build Coastguard Worker     default;
48*6777b538SAndroid Build Coastguard Worker 
SystemMetrics()49*6777b538SAndroid Build Coastguard Worker SystemMetrics::SystemMetrics() {
50*6777b538SAndroid Build Coastguard Worker   committed_memory_ = 0;
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker 
Sample()53*6777b538SAndroid Build Coastguard Worker SystemMetrics SystemMetrics::Sample() {
54*6777b538SAndroid Build Coastguard Worker   SystemMetrics system_metrics;
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   system_metrics.committed_memory_ = GetSystemCommitCharge();
57*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
58*6777b538SAndroid Build Coastguard Worker   GetSystemMemoryInfo(&system_metrics.memory_info_);
59*6777b538SAndroid Build Coastguard Worker   GetVmStatInfo(&system_metrics.vmstat_info_);
60*6777b538SAndroid Build Coastguard Worker   GetSystemDiskInfo(&system_metrics.disk_info_);
61*6777b538SAndroid Build Coastguard Worker #endif
62*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS)
63*6777b538SAndroid Build Coastguard Worker   GetSwapInfo(&system_metrics.swap_info_);
64*6777b538SAndroid Build Coastguard Worker   GetGraphicsMemoryInfo(&system_metrics.gpu_memory_info_);
65*6777b538SAndroid Build Coastguard Worker #endif
66*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
67*6777b538SAndroid Build Coastguard Worker   GetSystemPerformanceInfo(&system_metrics.performance_);
68*6777b538SAndroid Build Coastguard Worker #endif
69*6777b538SAndroid Build Coastguard Worker   return system_metrics;
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker 
ToDict() const72*6777b538SAndroid Build Coastguard Worker Value::Dict SystemMetrics::ToDict() const {
73*6777b538SAndroid Build Coastguard Worker   Value::Dict res;
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   res.Set("committed_memory", static_cast<int>(committed_memory_));
76*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
77*6777b538SAndroid Build Coastguard Worker   Value::Dict meminfo = memory_info_.ToDict();
78*6777b538SAndroid Build Coastguard Worker   meminfo.Merge(vmstat_info_.ToDict());
79*6777b538SAndroid Build Coastguard Worker   res.Set("meminfo", std::move(meminfo));
80*6777b538SAndroid Build Coastguard Worker   res.Set("diskinfo", disk_info_.ToDict());
81*6777b538SAndroid Build Coastguard Worker #endif
82*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS)
83*6777b538SAndroid Build Coastguard Worker   res.Set("swapinfo", swap_info_.ToDict());
84*6777b538SAndroid Build Coastguard Worker   res.Set("gpu_meminfo", gpu_memory_info_.ToDict());
85*6777b538SAndroid Build Coastguard Worker #endif
86*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
87*6777b538SAndroid Build Coastguard Worker   res.Set("perfinfo", performance_.ToDict());
88*6777b538SAndroid Build Coastguard Worker #endif
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   return res;
91*6777b538SAndroid Build Coastguard Worker }
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker ProcessMetrics::~ProcessMetrics() = default;
94*6777b538SAndroid Build Coastguard Worker 
CreateCurrentProcessMetrics()95*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateCurrentProcessMetrics() {
96*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_MAC)
97*6777b538SAndroid Build Coastguard Worker   return CreateProcessMetrics(base::GetCurrentProcessHandle());
98*6777b538SAndroid Build Coastguard Worker #else
99*6777b538SAndroid Build Coastguard Worker   return CreateProcessMetrics(base::GetCurrentProcessHandle(), nullptr);
100*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_MAC)
101*6777b538SAndroid Build Coastguard Worker }
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FREEBSD) || !BUILDFLAG(IS_POSIX)
GetPlatformIndependentCPUUsage(TimeDelta cumulative_cpu)104*6777b538SAndroid Build Coastguard Worker double ProcessMetrics::GetPlatformIndependentCPUUsage(
105*6777b538SAndroid Build Coastguard Worker     TimeDelta cumulative_cpu) {
106*6777b538SAndroid Build Coastguard Worker   TimeTicks time = TimeTicks::Now();
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   if (last_cumulative_cpu_.is_zero()) {
109*6777b538SAndroid Build Coastguard Worker     // First call, just set the last values.
110*6777b538SAndroid Build Coastguard Worker     last_cumulative_cpu_ = cumulative_cpu;
111*6777b538SAndroid Build Coastguard Worker     last_cpu_time_ = time;
112*6777b538SAndroid Build Coastguard Worker     return 0;
113*6777b538SAndroid Build Coastguard Worker   }
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker   TimeDelta cpu_time_delta = cumulative_cpu - last_cumulative_cpu_;
116*6777b538SAndroid Build Coastguard Worker   TimeDelta time_delta = time - last_cpu_time_;
117*6777b538SAndroid Build Coastguard Worker   if (time_delta.is_zero())
118*6777b538SAndroid Build Coastguard Worker     return 0;
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   last_cumulative_cpu_ = cumulative_cpu;
121*6777b538SAndroid Build Coastguard Worker   last_cpu_time_ = time;
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker   return 100.0 * cpu_time_delta / time_delta;
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker base::expected<double, ProcessCPUUsageError>
GetPlatformIndependentCPUUsage()127*6777b538SAndroid Build Coastguard Worker ProcessMetrics::GetPlatformIndependentCPUUsage() {
128*6777b538SAndroid Build Coastguard Worker   return GetCumulativeCPUUsage().transform([this](base::TimeDelta cpu_usage) {
129*6777b538SAndroid Build Coastguard Worker     return GetPlatformIndependentCPUUsage(cpu_usage);
130*6777b538SAndroid Build Coastguard Worker   });
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker #endif
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
135*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups)136*6777b538SAndroid Build Coastguard Worker int ProcessMetrics::CalculateIdleWakeupsPerSecond(
137*6777b538SAndroid Build Coastguard Worker     uint64_t absolute_idle_wakeups) {
138*6777b538SAndroid Build Coastguard Worker   return CalculateEventsPerSecond(absolute_idle_wakeups,
139*6777b538SAndroid Build Coastguard Worker                                   &last_absolute_idle_wakeups_,
140*6777b538SAndroid Build Coastguard Worker                                   &last_idle_wakeups_time_);
141*6777b538SAndroid Build Coastguard Worker }
142*6777b538SAndroid Build Coastguard Worker #else
GetIdleWakeupsPerSecond()143*6777b538SAndroid Build Coastguard Worker int ProcessMetrics::GetIdleWakeupsPerSecond() {
144*6777b538SAndroid Build Coastguard Worker   NOTIMPLEMENTED();  // http://crbug.com/120488
145*6777b538SAndroid Build Coastguard Worker   return 0;
146*6777b538SAndroid Build Coastguard Worker }
147*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
148*6777b538SAndroid Build Coastguard Worker         // || BUILDFLAG(IS_AIX)
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
CalculatePackageIdleWakeupsPerSecond(uint64_t absolute_package_idle_wakeups)151*6777b538SAndroid Build Coastguard Worker int ProcessMetrics::CalculatePackageIdleWakeupsPerSecond(
152*6777b538SAndroid Build Coastguard Worker     uint64_t absolute_package_idle_wakeups) {
153*6777b538SAndroid Build Coastguard Worker   return CalculateEventsPerSecond(absolute_package_idle_wakeups,
154*6777b538SAndroid Build Coastguard Worker                                   &last_absolute_package_idle_wakeups_,
155*6777b538SAndroid Build Coastguard Worker                                   &last_package_idle_wakeups_time_);
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_APPLE)
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker }  // namespace base
161