libchrome: Remove backward compatibility patch for metrics
BUG=b:329506713
TEST=CQ
Cq-Depend: chromium:5372947
Change-Id: Iac33f42275b8e962716d3fa944bf458ecafdb769
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/libchrome/+/5373065
Commit-Queue: Nathan Muggli <nmuggli@google.com>
Reviewed-by: Qijiang YĆ«ki Ishii <fqj@google.com>
Tested-by: Nathan Muggli <nmuggli@google.com>
diff --git a/libchrome_tools/patches/backward-compatibility-0200-Revert-Return-nullopt-on-error-from-ProcessMetrics-C.patch b/libchrome_tools/patches/backward-compatibility-0200-Revert-Return-nullopt-on-error-from-ProcessMetrics-C.patch
deleted file mode 100644
index 24bf4eb..0000000
--- a/libchrome_tools/patches/backward-compatibility-0200-Revert-Return-nullopt-on-error-from-ProcessMetrics-C.patch
+++ /dev/null
@@ -1,458 +0,0 @@
-From 1793b7e0837efdf44ba08e9289ac0d24727a1947 Mon Sep 17 00:00:00 2001
-From: Nathan Muggli <nmuggli@google.com>
-Date: Wed, 13 Mar 2024 16:07:37 -0600
-Subject: [PATCH] Revert "Return nullopt on error from ProcessMetrics CPU
- measurements"
-
-This reverts commit 94912573bfad4a687bc86cbbcbafad7ec0dad19e.
----
- base/process/internal_linux.cc | 15 ++---
- base/process/internal_linux.h | 9 ---
- base/process/process_metrics.cc | 8 +--
- base/process/process_metrics.h | 15 ++---
- base/process/process_metrics_apple.cc | 14 ++---
- base/process/process_metrics_linux.cc | 56 ++++++++----------
- base/process/process_metrics_unittest.cc | 72 ++++++++++++++++--------
- ipc/ipc_cpu_perftest.cc | 6 +-
- 8 files changed, 90 insertions(+), 105 deletions(-)
-
-diff --git a/base/process/internal_linux.cc b/base/process/internal_linux.cc
-index c8f38dc28c..b9d3f0f851 100644
---- a/base/process/internal_linux.cc
-+++ b/base/process/internal_linux.cc
-@@ -14,7 +14,6 @@
- #include "base/files/file_util.h"
- #include "base/logging.h"
- #include "base/notreached.h"
--#include "base/numerics/safe_conversions.h"
- #include "base/strings/string_number_conversions.h"
- #include "base/strings/string_split.h"
- #include "base/strings/string_util.h"
-@@ -207,17 +206,10 @@ void ParseProcStat(const std::string& contents, ProcStatMap* output) {
- int64_t GetProcStatsFieldAsInt64(const std::vector<std::string>& proc_stats,
- ProcStatsFields field_num) {
- DCHECK_GE(field_num, VM_PPID);
-- return GetProcStatsFieldAsOptionalInt64(proc_stats, field_num).value_or(0);
--}
-+ CHECK_LT(static_cast<size_t>(field_num), proc_stats.size());
-
--std::optional<int64_t> GetProcStatsFieldAsOptionalInt64(
-- base::span<const std::string> proc_stats,
-- ProcStatsFields field_num) {
- int64_t value;
-- if (StringToInt64(proc_stats[size_t{field_num}], &value)) {
-- return value;
-- }
-- return std::nullopt;
-+ return StringToInt64(proc_stats[field_num], &value) ? value : 0;
- }
-
- size_t GetProcStatsFieldAsSizeT(const std::vector<std::string>& proc_stats,
-@@ -250,7 +242,8 @@ int64_t ReadProcSelfStatsAndGetFieldAsInt64(ProcStatsFields field_num) {
- return ReadStatFileAndGetFieldAsInt64(stat_file, field_num);
- }
-
--size_t ReadProcStatsAndGetFieldAsSizeT(pid_t pid, ProcStatsFields field_num) {
-+size_t ReadProcStatsAndGetFieldAsSizeT(pid_t pid,
-+ ProcStatsFields field_num) {
- std::string stats_data;
- if (!ReadProcStats(pid, &stats_data))
- return 0;
-diff --git a/base/process/internal_linux.h b/base/process/internal_linux.h
-index e7b70601bc..a2657a7bc3 100644
---- a/base/process/internal_linux.h
-+++ b/base/process/internal_linux.h
-@@ -11,11 +11,9 @@
- #include <stddef.h>
- #include <stdint.h>
- #include <unistd.h>
--#include <optional>
- #include <string>
- #include <vector>
-
--#include "base/containers/span.h"
- #include "base/files/dir_reader_posix.h"
- #include "base/files/file_path.h"
- #include "base/process/process_handle.h"
-@@ -102,13 +100,6 @@ enum ProcStatsFields {
- int64_t GetProcStatsFieldAsInt64(const std::vector<std::string>& proc_stats,
- ProcStatsFields field_num);
-
--// Reads the `field_num`th field from `proc_stats`. Asserts that `field_num` is
--// a valid index into `proc_stats`. Returns nullopt if the field doesn't contain
--// a valid integer.
--std::optional<int64_t> GetProcStatsFieldAsOptionalInt64(
-- base::span<const std::string> proc_stats,
-- ProcStatsFields field_num);
--
- // Same as GetProcStatsFieldAsInt64(), but for size_t values.
- size_t GetProcStatsFieldAsSizeT(const std::vector<std::string>& proc_stats,
- ProcStatsFields field_num);
-diff --git a/base/process/process_metrics.cc b/base/process/process_metrics.cc
-index e9d90dcad8..e59252c6e3 100644
---- a/base/process/process_metrics.cc
-+++ b/base/process/process_metrics.cc
-@@ -123,12 +123,8 @@ double ProcessMetrics::GetPlatformIndependentCPUUsage(
- return 100.0 * cpu_time_delta / time_delta;
- }
-
--std::optional<double> ProcessMetrics::GetPlatformIndependentCPUUsage() {
-- const std::optional<TimeDelta> cpu_usage = GetCumulativeCPUUsage();
-- if (!cpu_usage.has_value()) {
-- return std::nullopt;
-- }
-- return GetPlatformIndependentCPUUsage(cpu_usage.value());
-+double ProcessMetrics::GetPlatformIndependentCPUUsage() {
-+ return GetPlatformIndependentCPUUsage(GetCumulativeCPUUsage());
- }
- #endif
-
-diff --git a/base/process/process_metrics.h b/base/process/process_metrics.h
-index db4ea9d024..b9688fe6ed 100644
---- a/base/process/process_metrics.h
-+++ b/base/process/process_metrics.h
-@@ -12,7 +12,6 @@
- #include <stdint.h>
-
- #include <memory>
--#include <optional>
-
- #include "base/base_export.h"
- #include "base/gtest_prod_util.h"
-@@ -125,16 +124,14 @@ class BASE_EXPORT ProcessMetrics {
- [[nodiscard]] double GetPlatformIndependentCPUUsage(TimeDelta cumulative_cpu);
-
- // Same as the above, but automatically calls GetCumulativeCPUUsage() to
-- // determine the current cumulative CPU. Returns nullopt if
-- // GetCumulativeCPUUsage() fails.
-- [[nodiscard]] std::optional<double> GetPlatformIndependentCPUUsage();
-+ // determine the current cumulative CPU.
-+ [[nodiscard]] double GetPlatformIndependentCPUUsage();
-
- // Returns the cumulative CPU usage across all threads of the process since
-- // process start, or nullopt on error. In case of multi-core processors, a
-- // process can consume CPU at a rate higher than wall-clock time, e.g. two
-- // cores at full utilization will result in a time delta of 2 seconds/per 1
-- // wall-clock second.
-- [[nodiscard]] std::optional<TimeDelta> GetCumulativeCPUUsage();
-+ // process start. In case of multi-core processors, a process can consume CPU
-+ // at a rate higher than wall-clock time, e.g. two cores at full utilization
-+ // will result in a time delta of 2 seconds/per 1 wall-clock second.
-+ [[nodiscard]] TimeDelta GetCumulativeCPUUsage();
-
- #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
- BUILDFLAG(IS_AIX)
-diff --git a/base/process/process_metrics_apple.cc b/base/process/process_metrics_apple.cc
-index 685e0c4360..1a23c8a083 100644
---- a/base/process/process_metrics_apple.cc
-+++ b/base/process/process_metrics_apple.cc
-@@ -11,8 +11,6 @@
- #include <stdint.h>
- #include <sys/sysctl.h>
-
--#include <optional>
--
- #include "base/apple/mach_logging.h"
- #include "base/apple/scoped_mach_port.h"
- #include "base/logging.h"
-@@ -95,10 +93,10 @@ mach_port_t ProcessMetrics::TaskForHandle(ProcessHandle process_handle) const {
- return task;
- }
-
--std::optional<TimeDelta> ProcessMetrics::GetCumulativeCPUUsage() {
-+TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
- mach_port_t task = TaskForHandle(process_);
- if (task == MACH_PORT_NULL) {
-- return std::nullopt;
-+ return TimeDelta();
- }
-
- // Libtop explicitly loops over the threads (libtop_pinfo_update_cpu_usage()
-@@ -110,12 +108,12 @@ std::optional<TimeDelta> ProcessMetrics::GetCumulativeCPUUsage() {
- &thread_info_count);
- if (kr != KERN_SUCCESS) {
- // Most likely cause: |task| is a zombie.
-- return std::nullopt;
-+ return TimeDelta();
- }
-
- task_basic_info_64 task_info_data;
- if (!GetTaskInfo(task, &task_info_data)) {
-- return std::nullopt;
-+ return TimeDelta();
- }
-
- /* Set total_time. */
-@@ -139,10 +137,10 @@ std::optional<TimeDelta> ProcessMetrics::GetCumulativeCPUUsage() {
- // a lag before it shows up in the terminated thread times returned by
- // GetTaskInfo(). Make sure CPU usage doesn't appear to go backwards if
- // GetCumulativeCPUUsage() is called in the interval.
-- return std::optional(last_measured_cpu_);
-+ return last_measured_cpu_;
- }
- last_measured_cpu_ = measured_cpu;
-- return std::optional(measured_cpu);
-+ return measured_cpu;
- }
-
- int ProcessMetrics::GetPackageIdleWakeupsPerSecond() {
-diff --git a/base/process/process_metrics_linux.cc b/base/process/process_metrics_linux.cc
-index 0ed005ff09..5d11ac6638 100644
---- a/base/process/process_metrics_linux.cc
-+++ b/base/process/process_metrics_linux.cc
-@@ -17,7 +17,6 @@
- #include <optional>
- #include <utility>
-
--#include "base/containers/span.h"
- #include "base/cpu.h"
- #include "base/files/dir_reader_posix.h"
- #include "base/files/file_util.h"
-@@ -58,26 +57,24 @@ uint64_t ReadFileToUint64(const FilePath& file) {
- }
- #endif
-
--// Get the total CPU from a proc stat buffer. Return value is a TimeDelta
--// converted from a number of jiffies on success or nullopt if parsing failed.
--std::optional<TimeDelta> ParseTotalCPUTimeFromStats(
-- base::span<const std::string> proc_stats) {
-- const std::optional<int64_t> utime =
-- internal::GetProcStatsFieldAsOptionalInt64(proc_stats,
-- internal::VM_UTIME);
-- if (utime.value_or(-1) < 0) {
-- return std::nullopt;
-- }
-- const std::optional<int64_t> stime =
-- internal::GetProcStatsFieldAsOptionalInt64(proc_stats,
-- internal::VM_UTIME);
-- if (stime.value_or(-1) < 0) {
-- return std::nullopt;
-+// Get the total CPU from a proc stat buffer. Return value is number of jiffies
-+// on success or 0 if parsing failed.
-+int64_t ParseTotalCPUTimeFromStats(const std::vector<std::string>& proc_stats) {
-+ return internal::GetProcStatsFieldAsInt64(proc_stats, internal::VM_UTIME) +
-+ internal::GetProcStatsFieldAsInt64(proc_stats, internal::VM_STIME);
-+}
-+
-+// Get the total CPU of a single process. Return value is number of jiffies
-+// on success or -1 on error.
-+int64_t GetProcessCPU(pid_t pid) {
-+ std::string buffer;
-+ std::vector<std::string> proc_stats;
-+ if (!internal::ReadProcStats(pid, &buffer) ||
-+ !internal::ParseProcStats(buffer, &proc_stats)) {
-+ return -1;
- }
-- const TimeDelta cpu_time = internal::ClockTicksToTimeDelta(
-- base::ClampAdd(utime.value(), stime.value()));
-- CHECK(!cpu_time.is_negative());
-- return std::optional(cpu_time);
-+
-+ return ParseTotalCPUTimeFromStats(proc_stats);
- }
-
- } // namespace
-@@ -93,15 +90,8 @@ size_t ProcessMetrics::GetResidentSetSize() const {
- checked_cast<size_t>(getpagesize());
- }
-
--std::optional<TimeDelta> ProcessMetrics::GetCumulativeCPUUsage() {
-- std::string buffer;
-- std::vector<std::string> proc_stats;
-- if (!internal::ReadProcStats(process_, &buffer) ||
-- !internal::ParseProcStats(buffer, &proc_stats)) {
-- return std::nullopt;
-- }
--
-- return ParseTotalCPUTimeFromStats(proc_stats);
-+TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
-+ return internal::ClockTicksToTimeDelta(GetProcessCPU(process_));
- }
-
- bool ProcessMetrics::GetCumulativeCPUUsagePerThread(
-@@ -120,11 +110,9 @@ bool ProcessMetrics::GetCumulativeCPUUsagePerThread(
- return;
- }
-
-- const std::optional<TimeDelta> thread_time =
-- ParseTotalCPUTimeFromStats(proc_stats);
-- if (thread_time.has_value()) {
-- cpu_per_thread.emplace_back(tid, thread_time.value());
-- }
-+ TimeDelta thread_time = internal::ClockTicksToTimeDelta(
-+ ParseTotalCPUTimeFromStats(proc_stats));
-+ cpu_per_thread.emplace_back(tid, thread_time);
- });
-
- return !cpu_per_thread.empty();
-diff --git a/base/process/process_metrics_unittest.cc b/base/process/process_metrics_unittest.cc
-index 230d22499e..84baef0f11 100644
---- a/base/process/process_metrics_unittest.cc
-+++ b/base/process/process_metrics_unittest.cc
-@@ -8,7 +8,6 @@
- #include <stdint.h>
-
- #include <memory>
--#include <optional>
- #include <sstream>
- #include <string>
- #include <utility>
-@@ -37,7 +36,6 @@
- #include "build/blink_buildflags.h"
- #include "build/build_config.h"
- #include "build/chromeos_buildflags.h"
--#include "testing/gmock/include/gmock/gmock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "testing/multiprocess_func_list.h"
-
-@@ -66,12 +64,6 @@ namespace base::debug {
-
- namespace {
-
--using ::testing::AssertionFailure;
--using ::testing::AssertionResult;
--using ::testing::AssertionSuccess;
--using ::testing::Ge;
--using ::testing::Optional;
--
- #if ENABLE_CPU_TESTS
-
- void BusyWork(std::vector<std::string>* vec) {
-@@ -82,21 +74,19 @@ void BusyWork(std::vector<std::string>* vec) {
- }
- }
-
--// Tests that GetCumulativeCPUUsage() returns a valid result that's equal to or
--// greater than `prev_cpu_usage`, and returns the result. If
--// GetCumulativeCPUUsage() returns an error, records a failed expectation and
--// returns an empty TimeDelta so that each test doesn't need to check for
--// nullopt repeatedly.
- TimeDelta TestCumulativeCPU(ProcessMetrics* metrics, TimeDelta prev_cpu_usage) {
-- const std::optional<TimeDelta> current_cpu_usage =
-- metrics->GetCumulativeCPUUsage();
-- EXPECT_THAT(current_cpu_usage, Optional(Ge(prev_cpu_usage)));
-- EXPECT_THAT(metrics->GetPlatformIndependentCPUUsage(), Optional(Ge(0.0)));
-- return current_cpu_usage.value_or(TimeDelta());
-+ const TimeDelta current_cpu_usage = metrics->GetCumulativeCPUUsage();
-+ EXPECT_GE(current_cpu_usage, prev_cpu_usage);
-+ EXPECT_GE(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-+ return current_cpu_usage;
- }
-
- #endif // ENABLE_CPU_TESTS
-
-+using ::testing::AssertionFailure;
-+using ::testing::AssertionResult;
-+using ::testing::AssertionSuccess;
-+
- // Helper to deal with Mac process launching complexity. On other platforms this
- // is just a thin wrapper around SpawnMultiProcessTestChild.
- class TestChildLauncher {
-@@ -634,7 +624,7 @@ TEST_F(SystemMetricsTest, TestNoNegativeCpuUsage) {
- std::unique_ptr<ProcessMetrics> metrics =
- ProcessMetrics::CreateCurrentProcessMetrics();
-
-- EXPECT_THAT(metrics->GetPlatformIndependentCPUUsage(), Optional(Ge(0.0)));
-+ EXPECT_GE(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-
- Thread thread1("thread1");
- Thread thread2("thread2");
-@@ -697,15 +687,38 @@ TEST_F(SystemMetricsTest, MeasureChildCpuUsage) {
- #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
- // Windows and Fuchsia return final measurements of a process after it exits.
- TestCumulativeCPU(metrics.get(), cpu_usage2);
-+#elif BUILDFLAG(IS_APPLE)
-+ // Mac and iOS return 0 on error. GetPlatformIndependentCPUUsage subtracts
-+ // from this to get a negative.
-+ EXPECT_EQ(metrics->GetCumulativeCPUUsage(), TimeDelta());
-+ EXPECT_LT(metrics->GetPlatformIndependentCPUUsage(), 0.0);
- #else
-- // All other platforms return an error.
-- EXPECT_EQ(metrics->GetCumulativeCPUUsage(), std::nullopt);
-- EXPECT_EQ(metrics->GetPlatformIndependentCPUUsage(), std::nullopt);
-+ // All other platforms return a negative time value to indicate an error.
-+ EXPECT_LT(metrics->GetCumulativeCPUUsage(), TimeDelta());
-+ EXPECT_LT(metrics->GetPlatformIndependentCPUUsage(), 0.0);
- #endif
- }
-
- #endif // !BUILDFLAG(IS_APPLE) || BUILDFLAG(USE_BLINK)
-
-+#if BUILDFLAG(IS_FUCHSIA)
-+
-+// Fuchsia CHECK's when measuring an invalid procses.
-+using SystemMetricsDeathTest = SystemMetricsTest;
-+TEST_F(SystemMetricsDeathTest, InvalidProcessCpuUsage) {
-+ std::unique_ptr<ProcessMetrics> metrics =
-+ ProcessMetrics::CreateProcessMetrics(kNullProcessHandle);
-+ EXPECT_CHECK_DEATH(
-+ { [[maybe_unused]] TimeDelta usage = metrics->GetCumulativeCPUUsage(); });
-+ EXPECT_CHECK_DEATH({
-+ [[maybe_unused]] double usage = metrics->GetPlatformIndependentCPUUsage();
-+ });
-+}
-+
-+#else // !BUILDFLAG(IS_FUCHSIA)
-+
-+// Windows, Mac and iOS also return 0 on error. All other platforms return a
-+// negative value to indicate an error.
- TEST_F(SystemMetricsTest, InvalidProcessCpuUsage) {
- #if BUILDFLAG(IS_MAC)
- std::unique_ptr<ProcessMetrics> metrics =
-@@ -714,9 +727,20 @@ TEST_F(SystemMetricsTest, InvalidProcessCpuUsage) {
- std::unique_ptr<ProcessMetrics> metrics =
- ProcessMetrics::CreateProcessMetrics(kNullProcessHandle);
- #endif
-- EXPECT_EQ(metrics->GetCumulativeCPUUsage(), std::nullopt);
-- EXPECT_EQ(metrics->GetPlatformIndependentCPUUsage(), std::nullopt);
-+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE)
-+ EXPECT_EQ(metrics->GetCumulativeCPUUsage(), TimeDelta());
-+#else
-+ EXPECT_LT(metrics->GetCumulativeCPUUsage(), TimeDelta());
-+#endif
-+
-+ // The first call always caches the result of GetCumulativeCPUUsage() and
-+ // returns 0, even if it's an error value. The second call returns the delta
-+ // with the cached result, which is 0 when the second GetCumulativeCPUUsage()
-+ // call returns the same error value.
-+ EXPECT_EQ(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-+ EXPECT_EQ(metrics->GetPlatformIndependentCPUUsage(), 0.0);
- }
-+#endif // !BUILDFLAG(IS_FUCHSIA)
-
- #endif // ENABLE_CPU_TESTS
-
-diff --git a/ipc/ipc_cpu_perftest.cc b/ipc/ipc_cpu_perftest.cc
-index dacbdc987b..a58d6b401a 100644
---- a/ipc/ipc_cpu_perftest.cc
-+++ b/ipc/ipc_cpu_perftest.cc
-@@ -3,7 +3,6 @@
- // found in the LICENSE file.
-
- #include <memory>
--#include <optional>
- #include <string_view>
- #include <tuple>
-
-@@ -74,7 +73,7 @@ class PerfCpuLogger {
- process_metrics_(base::ProcessMetrics::CreateCurrentProcessMetrics()) {
- // Query the CPU usage once to start the recording interval.
- const double inital_cpu_usage =
-- process_metrics_->GetPlatformIndependentCPUUsage().value_or(-1.0);
-+ process_metrics_->GetPlatformIndependentCPUUsage();
- // This should have been the first call so the reported cpu usage should be
- // exactly zero.
- DCHECK_EQ(inital_cpu_usage, 0.0);
-@@ -84,8 +83,7 @@ class PerfCpuLogger {
- PerfCpuLogger& operator=(const PerfCpuLogger&) = delete;
-
- ~PerfCpuLogger() {
-- const double result =
-- process_metrics_->GetPlatformIndependentCPUUsage().value_or(-1.0);
-+ double result = process_metrics_->GetPlatformIndependentCPUUsage();
- base::LogPerfResult(test_name_.c_str(), result, "%");
- }
-
---
-2.44.0.278.ge034bb2e1d-goog
-